翼度科技»论坛 编程开发 .net 查看内容

list集合distinctby的使用

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
最近使用集合的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帮助过滤。在此记录以免忘记。

来源:https://www.cnblogs.com/guoxiaotian/p/18535633
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具