list集合distinctby的使用

打印 上一主题 下一主题

主题 846|帖子 846|积分 2538

最近使用集合的distinctby根据元素的某个属性进行过滤,但是末了的结果是需要有序的,所以想知道过滤后的顺序会不会改变。
怎样使用

官方文档:根据指定的键选择器函数返回序列中的差异元素
我的明白:根据指定的属性去重
代码
  1. var lista = new List<People>();
  2. lista.Add(new People()
  3. {
  4.     Name = "LaoWang",
  5.     Age = 1
  6. });
  7. lista.Add(new People()
  8. {
  9.     Name = "LaoLi",
  10.     Age = 2
  11. });
  12. lista.Add(new People()
  13. {
  14.     Name = "LaoLi42",
  15.     Age = 4
  16. });
  17. lista.Add(new People()
  18. {
  19.     Name = "LaoLi41",
  20.     Age = 4
  21. });
  22. lista.Add(new People()
  23. {
  24.     Name = "LaoZhang31",
  25.     Age = 3
  26. });
  27. lista.Add(new People()
  28. {
  29.     Name = "LaoZhang32",
  30.     Age = 3
  31. });
  32. var listb =lista.DistinctBy(a=>a.Age).ToList();
  33. foreach (var item in listb)
  34. {
  35.     Console.WriteLine(item.Name + " " + item.Age );
  36. }
复制代码
结果 :
  1. LaoWang 1
  2. LaoLi 2
  3. LaoLi42 4
  4. LaoZhang31 3
复制代码
过滤前后元素还是保持原有的顺序
看看源码
  1. private static IEnumerable<TSource> DistinctByIterator<TSource, TKey>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)
  2.         {
  3.             using IEnumerator<TSource> enumerator = source.GetEnumerator();
  4.             if (enumerator.MoveNext())
  5.             {
  6.                 var set = new HashSet<TKey>(DefaultInternalSetCapacity, comparer);
  7.                 do
  8.                 {
  9.                     TSource element = enumerator.Current;
  10.                     if (set.Add(keySelector(element)))
  11.                     {
  12.                         yield return element;
  13.                     }
  14.                 }
  15.                 while (enumerator.MoveNext());
  16.             }
  17.         }
复制代码
利用了hashset去重,元素顺序并没有打乱,起首将指定的key尝试添加进hashset,成功表明key并没有重复,失败表明已经有了雷同的key,此元素将会被过滤掉。
总结

DistinctBy 过滤前后元素的顺序保持稳定,内部使用hashset帮助过滤。在此记录以免忘记。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

渣渣兔

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表