list集合distinctby的使用

  • list集合distinctby的使用已关闭评论
  • 30 次浏览
  • A+
所属分类:.NET技术
摘要

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


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

如何使用

官方文档:根据指定的键选择器函数返回序列中的不同元素

我的理解:根据指定的属性去重

代码

var lista = new List<People>(); lista.Add(new People() {     Name = "LaoWang",     Age = 1 }); lista.Add(new People() {     Name = "LaoLi",     Age = 2 }); lista.Add(new People() {     Name = "LaoLi42",     Age = 4 }); lista.Add(new People() {     Name = "LaoLi41",     Age = 4 }); lista.Add(new People() {     Name = "LaoZhang31",     Age = 3 }); lista.Add(new People() {     Name = "LaoZhang32",     Age = 3 });  var listb =lista.DistinctBy(a=>a.Age).ToList(); foreach (var item in listb) {     Console.WriteLine(item.Name + " " + item.Age ); } 

结果 :

LaoWang 1 LaoLi 2 LaoLi42 4 LaoZhang31 3 

过滤前后元素还是保持原有的顺序

看看源码

private static IEnumerable<TSource> DistinctByIterator<TSource, TKey>(IEnumerable<TSource> source, Func<TSource, TKey> keySelector, IEqualityComparer<TKey>? comparer)         {             using IEnumerator<TSource> enumerator = source.GetEnumerator();               if (enumerator.MoveNext())             {                 var set = new HashSet<TKey>(DefaultInternalSetCapacity, comparer);                 do                 {                     TSource element = enumerator.Current;                     if (set.Add(keySelector(element)))                     {                         yield return element;                     }                 }                 while (enumerator.MoveNext());             }         } 

利用了hashset去重,元素顺序并没有打乱,首先将指定的key尝试添加进hashset,成功表明key并没有重复,失败表明已经有了相同的key,此元素将会被过滤掉。

总结

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