按明确的整数列表分组

时间:2012-10-03 12:11:36

标签: c# linq

MyObject()
{
     String dept;
     List<int> id;
     Object obj;
}

使用LINQ,如何按以下方式返回上述对象的列表:

按[department和EQUAL id list]对所有obj对象进行分组。如果列表包含相同的数字,则不一定是相同的顺序(一组)。

2 个答案:

答案 0 :(得分:3)

GroupBy有一个overload,可以接受自定义IEqualityComparer<MyObject>。当dept相等且id设置为相等时,写一个将两个对象视为相等的一个,并将其作为参数传递。

实现集合相等的便捷方法是编写

new HashSet(x.id).SetEquals(new HashSet(y.id))

虽然这样做效率最低,如果有很多比较可能不是最好的想法。

答案 1 :(得分:2)

建立Jon's answer,如果效率有问题,可以将每个对象的HashSet存储在匿名对象中:

myObjects.Select(x => new { myObject = x, hashSet = new HashSet(x.id) })
         .GroupBy(x => x.hashSet, HashSet<int>.CreateSetComparer())
         .SelectMany(x => x.GroupBy(y => y.myObject.dept))

如果您只想执行一个GroupBy,则可以将HashSet存储在Tuple或自定义类中,但之后您必须创建自己的IEqualityComparer