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