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帮助过滤。在此记录以免忘记。

posted @ 2024-11-08 18:36  果小天  阅读(83)  评论(0编辑  收藏  举报