擴展lamda表達中distinct按照字段去除重復


      首先,我們定義一個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>();                                

 

      以上三種,都可以達到去重效果。當然,你可以選擇第二種的擴展方法。

      具體使用,看個人喜歡。

      本文到此結束。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM