Linq to objects 具有相等集合的组对象
假设有两个类,人和宠物。每个人都有一个或多个宠物的集合。 我如何将该人分组到他们共享相同宠物的集合中 例如: 人1:猫、狗、蜘蛛 人2:猫、蜘蛛、蛇 第三个人:狗 人4:蜘蛛、猫、狗 人5:狗 因此,我想要的是: 第1组:第1人、第4人 第2组:第3人、第5人 第3组:第2人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) {
如何使用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