C# 数组Linq 的三种去重方式Distinct
前言
首先给出我们需要用到的对象,如下:
-
public class Person
-
{
-
public string Name { get; set; }
-
public int Age { get; set; }
-
}
接下来我们添加100万条数据到集合中,如下:
-
var list = new List<Person>();
-
for (int i = 0; i < 1000000; i )
-
{
-
list.Add(new Person() { Age = 18, Name = "迷恋自留地" });
-
}
-
for (int i = 0; i < 1000; i )
-
{
-
list.Add(new Person() { Age = 19, Name = "迷恋自留地" });
-
}
第一种分组去重
年龄和名称进行分组,然后取第一条即可达到去重,如下:
-
var list1 = list.GroupBy(d => new { d.Age, d.Name })
-
.Select(d => d.FirstOrDefault())
-
.ToList();
第二种 HashSet去重 (扩展方法)
-
public static IEnumerable<TSource> Distinct<TSource, TKey>(
-
this IEnumerable<TSource> source,
-
Func<TSource, TKey> keySelector)
-
{
-
var hashSet = new HashSet<TKey>();
-
-
foreach (TSource element in source)
-
{
-
if (hashSet.Add(keySelector(element)))
-
{
-
yield return element;
-
}
-
}
-
}
述扩展方法即可去重,如下:
var list2 = list.Distinct(d => new { d.Age, d.Name }).ToList();
第三种 IEqualityComparer去重 (扩展方法)
-
public static class Extensions
-
{
-
public static IEnumerable<T> Distinct<T>(
-
this IEnumerable<T> source, Func<T, T, bool> comparer)
-
where T : class
-
=> source.Distinct(new DynamicEqualityComparer<T>(comparer));
-
-
private sealed class DynamicEqualityComparer<T> : IEqualityComparer<T>
-
where T : class
-
{
-
private readonly Func<T, T, bool> _func;
-
-
public DynamicEqualityComparer(Func<T, T, bool> func)
-
{
-
_func = func;
-
}
-
-
public bool Equals(T x, T y) => _func(x, y);
-
-
public int GetHashCode(T obj) => 0;
-
}
-
}
最终通过指定属性进行比较即可去重,如下:
list = list.Distinct((a, b) => a.Age == b.Age && a.Name == b.Name).ToList();
性能比较
我们来分析其耗时情况,如下:
-
var list = new List<Person>();
-
for (int i = 0; i < 1000000; i )
-
{
-
list.Add(new Person() { Age = 18, Name = "jeffcky" });
-
}
-
-
var time1 = Time(() =>
-
{
-
list.GroupBy(d => new { d.Age, d.Name })
-
.Select(d => d.FirstOrDefault())
-
.ToList();
-
});
-
Console.WriteLine($"分组耗时:{time1}");
-
-
var time2 = Time(() =>
-
{
-
list.Distinct(d => new { d.Age, d.Name }).ToList();
-
});
-
Console.WriteLine($"HashSet耗时:{time2}");
-
-
var time3 = Time(() =>
-
{
-
list.Distinct((a, b) => a.Age == b.Age && a.Name == b.Name).ToList();
-
});
-
Console.WriteLine($"委托耗时:{time3}");
-
-
-
static long Time(Action action)
-
{
-
var stopwatch = new Stopwatch();
-
stopwatch.Start();
-
action();
-
stopwatch.Stop();
-
return stopwatch.ElapsedMilliseconds;
-
}
LISP 复制 全屏
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgcabib
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01