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

C# 使用对象属性的linq获取distinct或groupby列表,c#,linq,C#,Linq,我有 List<ObjA> ObjA has ObjB ObjB has property Id 列表 ObjA有ObjB ObjB具有属性Id 如何根据Id获取不同ObjB的列表 感谢使用from,您可以使用以下功能: list.Select(a => a.ObjB).DistinctBy(b => b.Id); 如果您已在ObjB上覆盖.Equals(),以便将具有相同ID的项视为相等(而将具有不同ID的项视为不相等),则可以执行以下操作 var l

我有

List<ObjA>  
ObjA has ObjB  
ObjB has property Id  
列表
ObjA有ObjB
ObjB具有属性Id
如何根据Id获取不同ObjB的列表

感谢使用from,您可以使用以下功能:

list.Select(a => a.ObjB).DistinctBy(b => b.Id);

如果您已在
ObjB
上覆盖
.Equals()
,以便将具有相同ID的项视为相等(而将具有不同ID的项视为不相等),则可以执行以下操作

var list = GetListOfAs();

var distinctBs = list.Select(a => a.B).Distinct();
正如Daniel Hilgarth在他的回答中指出的,有一个扩展库名为,其中有一个方法名为
DistinctBy
。这样,您根本不需要覆盖
Equals
,只需调用

var distinctBs = list.Select(a => a.B).DistinctBy(b => b.ID);

您需要创建自己的
IEqualityComparer
,以便仅使用objb的Id属性来比较它们。然后你可以做:

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);
类ObjBEqualityComparer:IEqualityComparer{
公共布尔等于(ObjB x,ObjB y){
返回x.Id等于(y.Id);
}
公共int GetHashCode(OBO){
返回o.Id.GetHashCode();
}
}
var objBComparer=new ObjBEqualityComparer();
var result=objAList.Select(o=>o.ObjB).Distinct(objBComparer);
列表lst;
// ...
var distinctById=lst.Select(a=>a.b)//获取所有b
.GroupBy(b=>b.id)//按id分组
.选择(g=>g.First());//每个id取一个对象

这里有一个不需要扩展的解决方案:

List<ObjB> distinctObjB = lst
  .GroupBy(a => a.MyObjB.Id)
  .Select(b => b.First().MyObjB)
  .ToList();
List distinctObjB=lst
.GroupBy(a=>a.MyObjB.Id)
.Select(b=>b.First().MyObjB)
.ToList();

您所说的
ObjA有ObjB是什么意思
?ObjA有一个单独的属性是ObjB,非常感谢您为该网页提供linq;P
List<ObjB> distinctObjB = lst
  .GroupBy(a => a.MyObjB.Id)
  .Select(b => b.First().MyObjB)
  .ToList();