List根据某个字段(属性)去重
更新:2021-06-01
结合大佬@秋荷雨翔给出的方法(原文链接地址:https://www.cnblogs.com/s0611163/archive/2019/08/23/11399898.html),做了个简单的实验(根据用户姓名去重),实验不严谨,仅供参考

1 void Main() 2 { 3 //生成测试数据 4 DateTime dt = DateTime.Now; 5 Random rnd = new Random(); 6 List<User> list = new List<User>(); 7 int total = 1000; 8 for (int i = 0; i < total; i++) 9 { 10 User user = new User(); 11 user.Id = rnd.Next(1, total * 10); 12 user.Name = rnd.Next(1, total * 10).ToString(); 13 user.Old = rnd.Next(1,100); 14 list.Add(user); 15 } 16 double d = DateTime.Now.Subtract(dt).TotalMilliseconds; 17 18 //方法一 19 DateTime dt1 = DateTime.Now; 20 Dictionary<string, User> result1 = new Dictionary<string, User>(); 21 foreach (User item in list) 22 { 23 User temp; 24 if (!result1.TryGetValue(item.Name, out temp)) 25 { 26 result1.Add(item.Name, item); 27 } 28 } 29 List<User> r1 = result1.Values.ToList(); 30 double d1 = DateTime.Now.Subtract(dt1).TotalMilliseconds; 31 32 //方法二 33 DateTime dt2 = DateTime.Now; 34 List<User> result2 = list.ToLookup(item => item.Name).ToDictionary(item => item.Key, item => item.First()).Values.ToList(); 35 double d2 = DateTime.Now.Subtract(dt2).TotalMilliseconds; 36 37 //方法三 38 DateTime dt3 = DateTime.Now; 39 List<User> result3 = list.Where((x,i)=>list.FindIndex(z=>z.Name == x.Name) == i).ToList(); 40 double d3 = DateTime.Now.Subtract(dt3).TotalMilliseconds; 41 42 Console.WriteLine("生成 " + list.Count.ToString("# ####") + " 条测试数据耗时:" + d + "毫秒"); 43 Console.WriteLine("使用方法一去重耗时:" + d1 + "毫秒"); 44 Console.WriteLine("使用方法二去重耗时:" + d2 + "毫秒"); 45 Console.WriteLine("使用方法三去重耗时:" + d3 + "毫秒"); 46 Console.WriteLine("去重后数量:" + r1.Count + "," + result2.Count + "," + result3.Count); 47 } 48 49 50 public class User 51 { 52 public int Id {get;set;} 53 public string Name {get;set;} 54 public int Old {get;set;} 55 }
一千条数据结果:
一万条数据结果:
十万条数据结果:
百万条数据结果:运行时间太长,5分钟以上了,不等了,取消了
总结:
1、数据量越大三种方法耗时差距越明显
2、方法一、二各有优缺点,看具体场景
3、方法三不推荐(piapia打脸)
----我是分割线 以下是原文----
有时候自带的list.Distinct()去重并不能满足魔门的要求,比如以下情况
如果testList的Name相同则视为重复,则可以如下实现,比写循环语句简洁多了
testList.Where((x,i)=>testList.FindIndex(z=>z.name == x.name) == i)
PS:
参数x对应最外层的testList
参数i对应最外层testList内元素的位置索引(第几个元素)
参数z对应内层的testList
分类:
.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类