zoukankan      html  css  js  c++  java
  • [C#]LINQ中如何按实体的某个属性去重

    NET[C#]LINQ中如何按实体的某个属性去重后返回不重复的集合?

    问题描述

    比如有如下实体集合:

    Person1: Id=1, Name="Test1"
    Person2: Id=1, Name="Test1"
    Person3: Id=2, Name="Test2"
    

    如何使用LINQ按 Person.Id 去重,返回的集合只包含 Person1Person3

    方案一

    创建一个静态扩展类:

    public static IEnumerable<TSource> DistinctBy<TSource, TKey>
        (this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
    {
        HashSet<TKey> seenKeys = new HashSet<TKey>();
        foreach (TSource element in source)
        {
            if (seenKeys.Add(keySelector(element)))
            {
                yield return element;
            }
        }
    }
    

    调用方法:

    var query = people.DistinctBy(p => p.Id);
    

    如果需要按多个属性去重,则可以使用匿名对象,如:

    var query = people.DistinctBy(p => new { p.Id, p.Name });
    

    方案二

    List<Person> distinctPeople = allPeople
      .GroupBy(p => p.PersonId)
      .Select(g => g.First())
      .ToList();
    

    多属性去重:

    List<Person> distinctPeople = allPeople
      .GroupBy(p => new {p.PersonId, p.FavoriteColor} )
      .Select(g => g.First())
      .ToList();
    

    方案三

    var uniquePeople = from p in people
                       group p by new {p.ID} //or group by new {p.ID, p.Name, p.Whatever}
                       into mygroup
                       select mygroup.FirstOrDefault();
    

    方案四

    Persons.ToLookup(p => p.Id).Select(coll => coll.First());
    

    方案五

    var result = people.Where(p => !people.Any(q => (p != q && p.Id == q.Id)));
    
  • 相关阅读:
    [bzoj1064][Noi2008]假面舞会
    [bzoj1503][NOI2004]郁闷的出纳员
    [bzoj1758][Wc2010]重建计划
    [bzoj1588][HNOI2002]营业额统计
    [bzoj2423][HAOI2010]最长公共子序列
    [3.26福建四校联考]
    [51nod1238]最小公倍数之和V3
    [bzoj2301] [HAOI2011]Problem b
    [hdu5608]function
    [51nod1239欧拉函数之和]
  • 原文地址:https://www.cnblogs.com/kissy/p/9445160.html
Copyright © 2011-2022 走看看