1 votes

regrouper les objets avec des collections égales

Supposons 2 classes, Person et Pet. Chaque personne possède une collection d'un ou plusieurs animaux domestiques. Comment puis-je regrouper les personnes dans une collection où elles partagent les mêmes animaux.

Exemple :

Personne 1 : Chat, chien, araignée

Personne 2 : Chat, Araignée, Serpent

Personne 3 : Chien

Personne 4 : Araignée, chat, chien

Personne 5 : Chien

Ce que je veux comme résultat est ceci :

Groupe 1 : Personne 1, Personne 4

Groupe 2 : Personne 3, Personne 5

Groupe 3 : Personne 2

Comment puis-je y parvenir en utilisant LINQ ?

2voto

Handcraftsman Points 3166

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X