最近使用集合的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帮助过滤。在此记录以免忘记。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |