MyObject()
{
String dept;
List<int> id;
Object obj;
}
使用LINQ
,如何按以下方式返回上述对象的列表:
按[department和EQUAL id list]对所有obj对象进行分组。如果列表包含相同的数字,则不一定是相同的顺序(一组)。
答案 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
。