杭州首传网站建设公司怎么样,泊头做网站,建筑行业网站模板,河南企业网站优化外包咨询区 Patrick Desjardins#xff1a;我现在正在学习 LINQ#xff0c;对一个简单类型的 List 进行 Distinct() 是非常简单的#xff0c;如 Listint 或 Liststring#xff0c;但如果对复杂类型 ListT 的某一个或者多个属性进行 Distinct() 的话我现在正在学习 LINQ对一个简单类型的 List 进行 Distinct() 是非常简单的如 Listint 或 Liststring但如果对复杂类型 ListT 的某一个或者多个属性进行 Distinct() 的话该如何做呢比如下面的 Person 类public class Person{public int Id { get; set; }public string Name { get; set; }}ListPerson 内容如下。
Person1: Id1, NameTest1
Person2: Id1, NameTest1
Person3: Id2, NameTest2现在我如何通过 ID 对 ListPerson 进行去重呢最终我想要的结果是: person1 和 person3。回答区 Amy B如果你想对 Person 中的一个或者多个属性进行去重很简单可以对它们进行分组然后在每个组上选择一个 赢家 即可。
ListPerson distinctPeople allPeople.GroupBy(p p.PersonId).Select(g g.First()).ToList();如果基于多个属性进行去重可以使用 匿名类型。
ListPerson distinctPeople allPeople.GroupBy(p new {p.PersonId, p.FavoriteColor} ).Select(g g.First()).ToList();Jon Skeet如果你想实现 distinct-by 的效果其实自己实现一个就可以了写起来也非常简单。
public static IEnumerableTSource DistinctByTSource, TKey(this IEnumerableTSource source, FuncTSource, TKey keySelector)
{HashSetTKey seenKeys new HashSetTKey();foreach (TSource element in source){if (seenKeys.Add(keySelector(element))){yield return element;}}
}有了这个方法后现在可以根据 Id 属性进行去重了。
var query people.DistinctBy(p p.Id);如果是基于多个属性的话使用合适的 匿名类型。
var query people.DistinctBy(p new { p.Id, p.Name });点评区 其实 distinct-by 是一个非常实用的功能原生的 Linq 不提供支持还是有点可惜的 我记得以前为了实现此功能还特意让 类 实现 IEquatable 接口实现类型自定义代码如下public class Person : IEquatablePerson{public int Id { get; set; }public string Name { get; set; }public bool Equals(Person other){throw new NotImplementedException();}}对了如果你觉得 Linq 用的不够爽可以使用第三方的 Linq 扩展版MoreLinq官方地址https://github.com/morelinq/MoreLINQ原文链接https://stackoverflow.com/questions/489258/linqs-distinct-on-a-particular-property