具有相同集合的组对象

时间:2010-05-26 18:50:57

标签: linq-to-objects

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

示例:

人1:猫,狗,蜘蛛

人2:猫,蜘蛛,蛇

第3人:狗

人4:蜘蛛,猫,狗

人5:狗

我想要的结果是:

第1组:第1人,第4人

第2组:第3人,第5人

第3组:第2人

如何使用LINQ实现此目的?

1 个答案:

答案 0 :(得分:2)

一种方法是从宠物中建立一个类似的钥匙。例如,此方法对宠物进行排序,然后将它们组合成由“|”

分隔的单个字符串
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