MyObject()
{
String dept;
List<int> id;
Object obj;
}
使用LINQ
,我如何返回按如下方式组织的上述对象的列表:
按 [ 部门和 EQUAL id 列表 ] 对所有 obj 对象进行分组。如果列表包含相同的数字,则认为列表相等,不一定是相同的顺序(一组)。
GroupBy
有一个接受自定义的重载IEqualityComparer<MyObject>
。dept
写一个当两个对象相等且集合相等时认为两个对象id
相等,并将其作为参数传递。
实现集合相等的一种方便方法是编写
new HashSet(x.id).SetEquals(new HashSet(y.id))
虽然这最终会效率低下,如果有很多比较可能不是最好的主意。
根据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
.