我有
List<ObjA>
ObjA has ObjB
ObjB has property Id
如何根据Id获得不同的ObjB列表?
感谢
答案 0 :(得分:3)
使用DistinctBy中的MoreLinq,您可以使用:
list.Select(a => a.ObjB).DistinctBy(b => b.Id);
答案 1 :(得分:3)
您需要创建自己的IEqualityComparer<ObjB>
以仅使用其Id属性来比较ObjB。然后你可以这样做:
class ObjBEqualityComparer : IEqualityComparer<ObjB> {
public bool Equals(ObjB x, ObjB y) {
return x.Id.Equals(y.Id);
}
public int GetHashCode(ObjB o) {
return o.Id.GetHashCode();
}
}
var objBComparer = new ObjBEqualityComparer();
var result = objAList.Select(o => o.ObjB).Distinct(objBComparer);
答案 2 :(得分:2)
如果您在.Equals()
上覆盖了ObjB
,那么具有相同ID的项目将被视为相等(并且具有不同ID的项目被视为不相等),您可以
var list = GetListOfAs();
var distinctBs = list.Select(a => a.B).Distinct();
Daniel Hilgarth在回答中指出,有一个名为MoreLINQ的扩展库,其中有一个名为DistinctBy
的方法。有了这个,你根本不需要覆盖Equals
- 而只需要调用
var distinctBs = list.Select(a => a.B).DistinctBy(b => b.ID);
答案 3 :(得分:1)
List<ObjA> lst;
// ...
var distinctById = lst.Select(a => a.b) // get all B's
.GroupBy(b => b.id) // group by id's
.Select(g => g.First()); // take one object of each id
答案 4 :(得分:1)
这是一个不需要扩展的解决方案:
List<ObjB> distinctObjB = lst
.GroupBy(a => a.MyObjB.Id)
.Select(b => b.First().MyObjB)
.ToList();