L'un des moyens consiste à construire une clé comparable à partir des animaux domestiques. Par exemple, cette méthode trie les pets puis les combine en une seule chaîne séparée par '|'.
private static string GetPetKey(Person x)
{
return String.Join("|", x.Pets.OrderBy(y => y).ToArray());
}
Une personne avec les animaux de compagnie : "Araignée", "Chat", "Chien" obtient la clé : "Chat|Chien|Araignée".
Utilisez ensuite cette clé comme clé de regroupement LINQ.
var grouped = people.GroupBy(x => GetPetKey(x))
mise en œuvre de l'échantillon :
var people = new List<Person>
{
new Person
{
Id = 1,
Pets = new[] { "Cat", "Dog", "Spider" }
},
new Person
{
Id = 2,
Pets = new[] { "Cat", "Spider", "Snake" }
},
new Person
{
Id = 3,
Pets = new[] { "Dog" }
},
new Person
{
Id = 4,
Pets = new[] { "Spider", "Cat", "Dog" }
},
new Person
{
Id = 5,
Pets = new[] { "Dog" }
}
};
var grouped = people.GroupBy(x => GetPetKey(x)).ToList();
grouped.ForEach(WriteGroup);
aide à la sortie
private static void WriteGroup(IGrouping<string, Person> grouping)
{
Console.Write("People with " +String.Join(", ",grouping.First().Pets)+": ");
var people = grouping.Select(x=>"Person "+x.Id).ToArray();
Console.WriteLine(String.Join(", ", people));
}
sortie :
People with Cat, Dog, Spider: Person 1, Person 4
People with Cat, Spider, Snake: Person 2
People with Dog: Person 3, Person 5