- A+
所属分类:.NET技术
最近使用集合的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
帮助过滤。在此记录以免忘记。