İnternette iyi bir arama yaptım ve bunu yapmanın hiçbir yolunu bulamadım. Eğer herkes temiz bir şekilde bilirse lütfen bana bildirin. Bu arada, işi yapmak için basit bir görev yazdım. kullanım şuna benzer: Yukarıdaki görev yürüttü sonra
<NormalizeByMetadata Items="@(ItemsToNormalize)" MetadataName="Filename">
<Output TaskParameter="NormalizedItems" ItemName="MyNormalizedItems"/>
</NormalizeByMetadata>
, MyNormalizedItems
Filename
meta verileri için farklı bir değere sahip ItemsToNormalize
sadece bu öğeleri içerecek. İki veya daha fazla öğe, Filename
meta verileri için aynı değere sahipse, ilk eşleme çıktıya dahil edilir.
MSBuild görev kodudur:
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();
}
}
}
Yararlı geliyor - teşekkürler. İhtiyacım olana kadar bunu deneyeceğim. –