前言 List集合操作去除重覆數據的這種情況經常會碰到,博客園裡面也有很多大神們做過,在這裡主要是借鑒然後自己整理了一下,主要是為了方便自己,以後再次碰到這種去重問題,直接打開自己的鏈接拿起鍵盤就是乾,,,, 一、方法一 利用HashSet去重,在實體類里重寫Equals和GetHashCode方法 ...
前言
List集合操作去除重覆數據的這種情況經常會碰到,博客園裡面也有很多大神們做過,在這裡主要是借鑒然後自己整理了一下,主要是為了方便自己,以後再次碰到這種去重問題,直接打開自己的鏈接拿起鍵盤就是乾,,,,
一、方法一
利用HashSet去重,在實體類里重寫Equals和GetHashCode方法
class Program { static void Main(string[] args) { List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; // 因為我們通常操作的是List集合,所以我在這裡把list轉成了HashSet類型來接受 HashSet<UserInfo> hs = new HashSet<UserInfo>(list); foreach (var item in hs) { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); } Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } public override bool Equals(object obj) { UserInfo user = obj as UserInfo; return this.Id == user.Id ; } public override int GetHashCode() { return this.Id.GetHashCode(); } } }
二、方法二
利用拉姆達表達式Distinct方法,我們轉到定義可以看到兩個重載的Distinct方法,如圖
我們再轉到定義看看IEqualityComparer介面裡面到底是個啥玩意,原來有兩個方法
這時候我們來實現IEqualityComparer介面裡面的方法
class Program { static void Main(string[] args) { UserInfo info = new UserInfo(); List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; list.Distinct(new DistinctCompare()).ToList().ForEach(item => { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); }); Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } } class DistinctCompare : IEqualityComparer<UserInfo> { public bool Equals(UserInfo x, UserInfo y) { return x.Id == y.Id;//可以自定義去重規則,此處將Id相同的就作為重覆記錄 } public int GetHashCode(UserInfo obj) { return obj.Id.GetHashCode(); } } }
我們再來寫一個通用的擴展方法
幫助類
public static class DistinctHelper { /// <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> DistinctEx<T, C>(this IEnumerable<T> source, Func<T, C> getfield) { return source.Distinct(new Compare<T, C>(getfield)); } } 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)); } }
實現
class Program { static void Main(string[] args) { UserInfo info = new UserInfo(); List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; list.DistinctEx(x => x.Id).ToList().ForEach(item => { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); }); Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } } }
三、方法三
利用拉姆達表達式一句話即可
class Program { static void Main(string[] args) { List<UserInfo> list = new List<UserInfo>() { new UserInfo() { Id="1", UserName="111"}, new UserInfo() { Id="1", UserName="111"} }; // 用拉姆達表達式一句話即可實現去重 var result = list.Where((x,i)=>list.FindIndex(y=>y.Id==x.Id)==i); result.ToList().ForEach(item=> { Console.WriteLine($"Id:{item.Id} UserName:{item.UserName}"); }); Console.ReadKey(); } class UserInfo { public string Id { get; set; } public string UserName { get; set; } } }
權責申明
作者:SportSky 出處: http://www.cnblogs.com/sportsky/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步麽?那就【關註】我吧。