拡張lamda表現におけるdistinctはフィールドに従って重複を除去する

6977 ワード

まず、Studentクラスを定義してテストします.
  
 public class Student
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public int Age { get; set; }
    } 

      
 List data = new List { 
                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を用いると,発見されたデータは依然として同じであり,想像したように重複を除去していないことを発見した.
以下に、いくつかのソリューションを示します.
1つ目:EqualityComparerの継承
クラスを新規作成します.以下のとおりです.親クラスの抽象メソッドを書き換える必要があります.EqualsとGetHashCode
  
public class StudentComparer : EqualityComparer
    {
        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()); 
私たちが予想した効果を達成することができます.もちろん、これは面倒です.
2つ目.非相関汎集合HashSetにおける一意性に基づいてdistinctを拡張することができる.
拡張方法をどう書くか、ここでは詳しく話しません.
具体的には以下のように拡張します.
    
namespace  System.Linq
{
    public static class Class1
    {
       public static IEnumerable DistinctBy2(this IEnumerable source, Func  where)
        {
            HashSet hashSetData= new HashSet();
            foreach (T item in source)
            {
                if (hashSetData.Add(where(item)))
                {
                    yield return item;
                }
            }
        }  
    }
}

使用方法は以下の通りです:data.DistinctBy2(p => new { p.ID,p.Name}).ToList();//new{p.ID,P.Name}ここでは、重さを削除するフィールドを指定できます
3つ目.直接簡単にしてください.まずグループを分けて、各グループの中で最初の項目を取ります.
コードは次のとおりです.
  
//Lamda:    new {item.ID,item.Name} 
data.GroupBy(item => new { item.ID,item.Name }).Select(item =>  item.First()).ToList();

//-----------------------------------------------------------------

//Linq      new {item.ID,item.Name} 
                        (from item in data
                         group item by new { item.ID,item.Name} into g 
                         select g.First()).ToList();                                

 
以上の3種類は、いずれも重量除去効果を達成することができます.もちろん、2つ目の拡張方法を選択することができます.
具体的に使って、個人の好みを見ます.
本文はこれで終わります.
 
転載先:https://www.cnblogs.com/wzf-Code/p/5611496.html