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

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

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

4

2 回答 2

3

GroupBy有一个接受自定义的重载IEqualityComparer<MyObject>dept写一个当两个对象相等且集合相等时认为两个对象id相等,并将其作为参数传递。

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

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

虽然这最终会效率低下,如果有很多比较可能不是最好的主意。

于 2012-10-03T12:15:35.313 回答
2

根据Jon 的回答,如果效率是一个问题,您可以将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.

于 2012-10-03T15:09:42.380 回答