假设有两个类,Person和Pet。每个人都有一个或多个宠物的集合。 如何将人员分组到他们共享相同宠物的集合中。
示例:
人1:猫,狗,蜘蛛
人2:猫,蜘蛛,蛇
第3人:狗
人4:蜘蛛,猫,狗
人5:狗
我想要的结果是:
第1组:第1人,第4人
第2组:第3人,第5人
第3组:第2人
如何使用LINQ实现此目的?
答案 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