ToB企服应用市场:ToB评测及商务社交产业平台

标题: list集合distinctby的使用 [打印本页]

作者: 渣渣兔    时间: 2024-11-8 22:14
标题: list集合distinctby的使用
最近使用集合的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企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4