使用对象属性的linq获取distinct或groupby列表

时间:2011-07-27 11:19:01

标签: c# linq

我有

List<ObjA>  
ObjA has ObjB  
ObjB has property Id  

如何根据Id获得不同的ObjB列表?

感谢

5 个答案:

答案 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();