首先,我們定義一個Student類來測試. 在這樣一個數據中. 我們發現,如果使用自帶的 Distinct ,發現得數據依然是一樣,並沒有想象中的去除重覆。 以下,給出幾個解決方案。 第一種: 繼承EqualityComparer 我們新建一個類。如下。且必須重寫父類中的抽象方法。Equals和Ge ...
首先,我們定義一個Student類來測試.
public class Student { public int ID { get; set; } public string Name { get; set; } public int Age { get; set; } }
List<Student> data = new List<Student> { new Student(){ID=1,Name="名字1",Age=15}, new Student(){ID=1,Name="名字2",Age=15}, new Student(){ID=3,Name="名字3",Age=17}, new Student(){ID=4,Name="名字4",Age=18}, new Student(){ID=5,Name="名字5",Age=19}, new Student(){ID=6,Name="名字6",Age=20} };
在這樣一個數據中. 我們發現,如果使用自帶的 Distinct ,發現得數據依然是一樣,並沒有想象中的去除重覆。
以下,給出幾個解決方案。
第一種: 繼承EqualityComparer
我們新建一個類。如下。且必須重寫父類中的抽象方法。Equals和GetHashCode
public class StudentComparer : EqualityComparer<Student> { public override bool Equals(Student s1, Student s2) { //這裡寫你要去除重覆的條件。 return s1.ID == s2.ID && s1.Name == s2.Name; } public override int GetHashCode(Student student) { return student.ID.GetHashCode(); } }
使用方法:data.Distinct(new StudentComparer());
可以達到我們預料的效果,當然,這樣比較麻煩一點。
第二種。我們可以根據非關聯泛型集合HashSet<T>中的唯一性對distinct擴展
如何寫擴展方法,這裡我就不再細說。
具體擴展如下。
namespace System.Linq { public static class Class1 { public static IEnumerable<T> DistinctBy2<T, TResult>(this IEnumerable<T> source, Func<T, TResult> where) { HashSet<TResult> hashSetData= new HashSet<TResult>(); foreach (T item in source) { if (hashSetData.Add(where(item))) { yield return item; } } } } }
使用方法如下:data.DistinctBy2(p => new { p.ID,p.Name}).ToList<Student>(); //其中new {p.ID,P.Name}這裡可指定要根據去重的欄位
第三種。直接簡單一點。通過先分組,然後在每個組裡面取第一項。
代碼如下:
//Lamda: new {item.ID,item.Name}指定去重欄位 data.GroupBy(item => new { item.ID,item.Name }).Select(item => item.First()).ToList<Student>(); //----------------------------------------------------------------- //Linq new {item.ID,item.Name}指定去重欄位 (from item in data group item by new { item.ID,item.Name} into g select g.First()).ToList<Student>();
以上三種,都可以達到去重效果。當然,你可以選擇第二種的擴展方法。
具體使用,看個人喜歡。
本文到此結束。