我在網上有一個很好的搜索,找不到任何這樣做的方式。如果有人知道一個乾淨的內置方式,請讓我知道。同時,我寫了一個簡單的任務來完成這項工作。用法是這樣的:
<NormalizeByMetadata Items="@(ItemsToNormalize)" MetadataName="Filename">
<Output TaskParameter="NormalizedItems" ItemName="MyNormalizedItems"/>
</NormalizeByMetadata>
上述任務已執行後,MyNormalizedItems
只會包含ItemsToNormalize
具備爲Filename
元數據的獨特價值的項目。如果兩個或更多項目的元數據具有相同的值,則第一個匹配項將包含在輸出中。
用於MSBuild任務的代碼是:
public class NormalizeByMetadata : Task
{
[Required]
public ITaskItem[] Items
{
get;
set;
}
[Required]
public string MetadataName
{
get;
set;
}
[Output]
public ITaskItem[] NormalizedItems
{
get;
private set;
}
public override bool Execute()
{
NormalizedItems = Items.Distinct(new ItemEqualityComparer(MetadataName)).ToArray();
return true;
}
private sealed class ItemEqualityComparer : IEqualityComparer<ITaskItem>
{
private readonly string _metadataName;
public ItemEqualityComparer(string metadataName)
{
Debug.Assert(metadataName != null);
_metadataName = metadataName;
}
public bool Equals(ITaskItem x, ITaskItem y)
{
if (x == null || y == null)
{
return x == y;
}
var xMetadata = x.GetMetadata(_metadataName);
var yMetadata = y.GetMetadata(_metadataName);
return string.Equals(xMetadata, yMetadata);
}
public int GetHashCode(ITaskItem obj)
{
if (obj == null)
{
return 0;
}
var objMetadata = obj.GetMetadata(_metadataName);
return objMetadata.GetHashCode();
}
}
}
聽起來很有用 - 謝謝。下次嘗試這個時候我需要它。 – 2009-08-24 09:17:35