拡張lamda表現におけるdistinctはフィールドに従って重複を除去する
6977 ワード
まず、Studentクラスを定義してテストします.
このようなデータの中で.我々は,独自のDistinctを用いると,発見されたデータは依然として同じであり,想像したように重複を除去していないことを発見した.
以下に、いくつかのソリューションを示します.
1つ目:EqualityComparerの継承
クラスを新規作成します.以下のとおりです.親クラスの抽象メソッドを書き換える必要があります.EqualsとGetHashCode
使用方法:data.Distinct(new StudentComparer());
私たちが予想した効果を達成することができます.もちろん、これは面倒です.
2つ目.非相関汎集合HashSetにおける一意性に基づいてdistinctを拡張することができる.
拡張方法をどう書くか、ここでは詳しく話しません.
具体的には以下のように拡張します.
使用方法は以下の通りです:data.DistinctBy2(p => new { p.ID,p.Name}).ToList();//new{p.ID,P.Name}ここでは、重さを削除するフィールドを指定できます
3つ目.直接簡単にしてください.まずグループを分けて、各グループの中で最初の項目を取ります.
コードは次のとおりです.
以上の3種類は、いずれも重量除去効果を達成することができます.もちろん、2つ目の拡張方法を選択することができます.
具体的に使って、個人の好みを見ます.
本文はこれで終わります.
転載先:https://www.cnblogs.com/wzf-Code/p/5611496.html
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