Linq to objects 具有相等集合的组对象

Linq to objects 具有相等集合的组对象,linq-to-objects,Linq To Objects,假设有两个类,人和宠物。每个人都有一个或多个宠物的集合。 我如何将该人分组到他们共享相同宠物的集合中 例如: 人1:猫、狗、蜘蛛 人2:猫、蜘蛛、蛇 第三个人:狗 人4:蜘蛛、猫、狗 人5:狗 因此,我想要的是: 第1组:第1人、第4人 第2组:第3人、第5人 第3组:第2人 如何使用LINQ实现这一点?一种方法是用宠物创建一个可比较的钥匙。例如,此方法对宠物进行排序,然后将它们组合成单个字符串,以“|”分隔 private static string GetPetKey(Person x) {

假设有两个类,人和宠物。每个人都有一个或多个宠物的集合。 我如何将该人分组到他们共享相同宠物的集合中

例如:

人1:猫、狗、蜘蛛

人2:猫、蜘蛛、蛇

第三个人:狗

人4:蜘蛛、猫、狗

人5:狗

因此,我想要的是:

第1组:第1人、第4人

第2组:第3人、第5人

第3组:第2人


如何使用LINQ实现这一点?

一种方法是用宠物创建一个可比较的钥匙。例如,此方法对宠物进行排序,然后将它们组合成单个字符串,以“|”分隔

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