list集合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
帮助过滤。在此记录以免忘记。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· 深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异