List去重方法
方法一:遍历list
循环遍历List,借助Dictionary存储去重的对象
Dictionary<string, Item> result = new Dictionary<string, Item>(); foreach (Item item in list)//list为待去重列表 { Item temp; if (!result.TryGetValue(item.name, out temp)) { result.Add(item.name, item); } } List<Item> result_list = result.Values.ToList(); ///Item public class Item { public string name { get; set; } public string value { get; set; } }
方法二:ToLookup
利用ToLookup查找,并转为Dictionary
List<Item> result = list.ToLookup(item => item.name).ToDictionary(item => item.Key, item => item.First()).Values.ToList(); ///Item public class Item { public string name { get; set; } public string value { get; set; } }
方法三:自定义Compare
自定义Compare方法实现
List<Item> result = list.Distinct(new Compare()).ToList(); //compare方法 public class Compare : IEqualityComparer<Item> { public bool Equals(Item a, Item b) { return a.name == b.name; } public int GetHashCode(Item obj) { return obj.name.GetHashCode(); } } ///Item public class Item { public string name { get; set; } public string value { get; set; } }
Compare公用方法
public class Compare<T, C> : IEqualityComparer<T> { private Func<T, C> _getField; public Compare(Func<T, C> getfield) { this._getField = getfield; } public bool Equals(T x, T y) { return EqualityComparer<C>.Default.Equals(_getField(x), _getField(y)); } public int GetHashCode(T obj) { return EqualityComparer<C>.Default.GetHashCode(this._getField(obj)); } } public static class CommonHelper { /// <summary> /// 自定义Distinct扩展方法 /// </summary> /// <typeparam name="T">要去重的对象类</typeparam> /// <typeparam name="C">自定义去重的字段类型</typeparam> /// <param name="source">要去重的对象</param> /// <param name="getfield">获取自定义去重字段的委托</param> /// <returns></returns> public static IEnumerable<T> MyDistinct<T, C>(this IEnumerable<T> source, Func<T, C> getfield) { return source.Distinct(new Compare<T, C>(getfield)); } } //调用 list.MyDistinct(s=>s.Id).ToList().ForEach(s => Console.WriteLine(s.ToString()));
方法四:groupby
利用GroupBy分组实现
List<Item> result = list.GroupBy(item => item.name).Select(item => item.First()).ToList(); ///Item public class Item { public string name { get; set; } public string value { get; set; } }
总结:方法一和方法三去重效率差不多,方法二和方法四去重效率差不多,但是方法一和方法三的效率是方法二和方法四的四倍左右,所以推荐使用方法三。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构