групповой объект с равными коллекциями - PullRequest
1 голос
/ 26 мая 2010

Допустим, 2 класса, Персона и Пэт.У каждого человека есть коллекция из 1 или более домашних животных.Как мне сгруппировать человека в коллекцию, где у него одни и те же домашние животные.

Пример:

Человек 1: кошка, собака, паук

Человек 2: кошка,Паук, Змея

Человек 3: Собака

Человек 4: Паук, Кошка, Собака

Человек 5: Собака

В результате я хочу получитьэто:

Группа 1: Человек 1, Человек 4

Группа 2: Человек 3, Человек 5

Группа 3: Человек 2

Как мнедобиться этого с помощью LINQ?

1 Ответ

2 голосов
/ 27 мая 2010

Одним из способов является создание сопоставимого ключа из домашних животных. Например, этот метод сортирует домашних животных, затем объединяет их в одну строку, разделенную '|'

private static string GetPetKey(Person x)
{
    return String.Join("|", x.Pets.OrderBy(y => y).ToArray());
}

Человек с домашними животными: «Паук», «Кот», «Собака» получает ключ: «Кошка | Собака | Паук»

Затем используйте его в качестве ключа группировки LINQ

var grouped = people.GroupBy(x => GetPetKey(x))

пример реализации:

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);

помощник по выводу

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));
}

выход:

People with Cat, Dog, Spider: Person 1, Person 4
People with Cat, Spider, Snake: Person 2
People with Dog: Person 3, Person 5
...