J'ai fait une bonne recherche en ligne et je n'ai trouvé aucun moyen de le faire. Si quelqu'un connaît un mode intégré propre alors s'il vous plaît faites le moi savoir. En attendant, j'ai écrit une tâche simple pour faire le travail. L'utilisation ressemble à ceci:
<NormalizeByMetadata Items="@(ItemsToNormalize)" MetadataName="Filename">
<Output TaskParameter="NormalizedItems" ItemName="MyNormalizedItems"/>
</NormalizeByMetadata>
Une fois la tâche ci-dessus a exécuté, MyNormalizedItems
contiendra uniquement les articles de ItemsToNormalize
qui ont une valeur unique pour les Filename
métadonnées. Si deux ou plusieurs éléments ont la même valeur pour leurs métadonnées Filename
, la première correspondance sera incluse dans la sortie.
Le code de la tâche MSBuild est:
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();
}
}
}
Sons utiles - merci. Je vais essayer la prochaine fois que j'en ai besoin. –