C〓〓はDispinctを実現して対象を条件によって重さに行きます。
普段、私たちはc葃のDisctictを配列に対して重いものに使うことが多いです。一般的な配列を基礎とするデータのタイプ、例えばint、string。オブジェクトを重くするためにも使えます。
重荷重があります。最初のパラメータはthisを追加しました。開拓方法です。百度了解してください。
次はDispinctの対象を検討します。もし今Peopleの種類があるとします。
Discinctメソッドはパラメータを持たないと、オブジェクトセットのp,p 1,p 2をデクリメントしますが、オブジェクトのメンバー値が同じであるのに対し、オブジェクトのメンバー値が同じであるのに対して、デスティットメソッドはパラメータを加えないと説明します。
今、私たちはIDの同じPeopleに対して、同じ人としてカウントし、重複しない人を出力したいです。この時、Dispinctの第二の方法を使いました。方法は着信するパラメータはIEqualityComprerタイプです。一般的なインターフェースを継承します。
私達が比較する時には、PeopleCompreByIDのエンティティに入ればいいです。
ListPeople.Discinct(new PeopleCompreByID).ToList().ForEach(x=>Consolie.WriteLine(x);
運転結果は以下の通りです。
私たちはIDで重量を取る効果があります。
今は需要が変わりました。ID=0とProvince=湖北の存在が重複していることを見ました。これを重视して、もう一つのカテゴリーにしますか?それともIEqualityComprerから継承しますか?
ListPeople.Discinct(new PeopleCompreByID AndProvince().ToList().ForEach(x=>Consolite.WriteLine(x));
運転後の結果は以下の通りです。
追加:1.クラスのいずれかの属性はリスト配列であり、このリストの引用が同じかどうかによって同一のオブジェクトかを判断する。
上のコードをもう一度修正します。
結果から見ると、Tony 1、Tony 2のメンバー属性は同じ引用リストなので、繰り返しに行く時にTony 2を削除しました。
私たちが望む効果を達成しました。
追加:2.クラスのいずれかの属性はリスト配列であり、このリストの各要素の値が同じかどうかによって同じオブジェクトかを判断する。
新しいコンパレータを追加します。
配列値が1,2,11,222,3,4の残りは1つとなり、同じ値で繰り返される効果が見られます。
今後、3つまたは4つ以上の対象メンバーで対象が重複しているかどうかを決定する問題がある場合には、この方法を採用することができる。
以上は私の愚見です。このC〓〓〓はDispinctを実現して対象を条件によって重さに行きます。つまり、小編集はみんなのすべての内容に分かち合います。参考にしてほしいです。皆さんもよろしくお願いします。
重荷重があります。最初のパラメータはthisを追加しました。開拓方法です。百度了解してください。
次はDispinctの対象を検討します。もし今Peopleの種類があるとします。
public class People
{
public int ID { get; set; }
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public string Province { get; set; }
/// <summary>
///
/// </summary>
public int Age { get; set; }
public override string ToString()
{
return string.Format("ID:{0} Name:{1} Province:{2} Age:{3}", ID, Name, Province, Age);
}
}
ListPeoleオブジェクトの集合を宣言します。
People p = new People() { ID = 100, Name = "liu", Province = " ", Age = 100 };
People p1 = p;
People p2 = p1;
IEnumerable<People> ListPeople = new List<People>()
{
p,
p1,
p2,
new People(){ID=0,Name="li",Province=" ",Age=20},
new People(){ID=0,Name="li",Province=" ",Age=20},
new People(){ID=1,Name="li",Province=" ",Age=20},
new People(){ID=1,Name="li",Province=" ",Age=20},
new People(){ID=2,Name="li",Province=" ",Age=20},
new People(){ID=3,Name="li",Province=" ",Age=21},
new People(){ID=4,Name="li",Province=" ",Age=22},
};
私たちはListPeopleにDispinct方法を使いに来ました。パラメータは一切持っていません。運転結果は以下の通りです。Discinctメソッドはパラメータを持たないと、オブジェクトセットのp,p 1,p 2をデクリメントしますが、オブジェクトのメンバー値が同じであるのに対し、オブジェクトのメンバー値が同じであるのに対して、デスティットメソッドはパラメータを加えないと説明します。
今、私たちはIDの同じPeopleに対して、同じ人としてカウントし、重複しない人を出力したいです。この時、Dispinctの第二の方法を使いました。方法は着信するパラメータはIEqualityComprerタイプです。一般的なインターフェースを継承します。
public class PeopleCompareByID : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x == null || y == null)
return false;
if (x.ID == y.ID)
return true;
else
return false;
}
public int GetHashCode(People obj)
{
if (obj == null)
return 0;
else
return obj.ID.GetHashCode();
}
}
IEqualityComprerインターフェースを継承するには、EqualsとGet HashCodeの方法を実現する必要があります。私達が比較する時には、PeopleCompreByIDのエンティティに入ればいいです。
ListPeople.Discinct(new PeopleCompreByID).ToList().ForEach(x=>Consolie.WriteLine(x);
運転結果は以下の通りです。
私たちはIDで重量を取る効果があります。
今は需要が変わりました。ID=0とProvince=湖北の存在が重複していることを見ました。これを重视して、もう一つのカテゴリーにしますか?それともIEqualityComprerから継承しますか?
public class PeopleCompareByIDAndProvince : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x == null || y == null)
return false;
if (x.ID == y.ID&&x.Province==y.Province)
return true;
else
return false;
}
public int GetHashCode(People obj)
{
if (obj == null)
return 0;
else
return obj.ID.GetHashCode()^obj.Province.GetHashCode();
}
}
同様に、Dispinct方法を使用する場合、PeopleCompreByID AndProvinceに着信する例:ListPeople.Discinct(new PeopleCompreByID AndProvince().ToList().ForEach(x=>Consolite.WriteLine(x));
運転後の結果は以下の通りです。
追加:1.クラスのいずれかの属性はリスト配列であり、このリストの引用が同じかどうかによって同一のオブジェクトかを判断する。
上のコードをもう一度修正します。
class Program
{
static void Main(string[] args)
{
List<int> list = new List<int>() { 1, 2, 11, 222, 3, 4 };
List<int> list1 = new List<int>() { 1, 2, 11, 222, 3, 4 };
People p1 = new People() { Name = "Tony1", ID = 1, Age = 18, Members = list };
People p2 = new People() { Name = "Tony2", ID = 2, Age = 19, Members = list };
People p3 = new People() { Name = "Tony3", ID = 3, Age = 20, Members = list1 };
People p4 = new People() { Name = "Tony4", ID = 4, Age = 21, Members = new List<int>() };
List<People> personList = new List<People>() { p1, p2,p2,p3,p4 };
personList.Distinct(new PeopleComparedByList()).ToList().ForEach(x => Console.WriteLine(x));
Console.Read();
}
}
public class People
{
public int ID { get; set; }
/// <summary>
///
/// </summary>
public string Name { get; set; }
/// <summary>
///
/// </summary>
public string Province { get; set; }
/// <summary>
///
/// </summary>
public int Age { get; set; }
private List<int> members = new List<int>();
public List<int> Members
{
get { return members; }
set { members = value; }
}
public override string ToString()
{
return string.Format("ID:{0} Name:{1} Province:{2} Age:{3},Members:{4}", ID, Name, Province, Age,string.Join("-",this.Members.ToList()));
}
}
public class PeopleComparedByList : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x.Members == y.Members)
return true;
else
return false;
}
public int GetHashCode(People obj)
{
return obj.Members.GetHashCode();
}
}
運転の結果は以下の通りです。結果から見ると、Tony 1、Tony 2のメンバー属性は同じ引用リストなので、繰り返しに行く時にTony 2を削除しました。
私たちが望む効果を達成しました。
追加:2.クラスのいずれかの属性はリスト配列であり、このリストの各要素の値が同じかどうかによって同じオブジェクトかを判断する。
新しいコンパレータを追加します。
public class PeopleComparedByListValue : IEqualityComparer<People>
{
public bool Equals(People x, People y)
{
if (x.Members == null && y.Members == null)
return true;
if (x.Members == null || y.Members == null)
return false;
if (x.Members.Count != y.Members.Count)
return false;
//
for (int i = 0; i < x.Members.Count; i++)
{
if (x.Members[i] != y.Members[i])
return false;
}
return true;
}
public int GetHashCode(People obj)
{
var hashCode = 1;
if (obj.Members == null)
return 0;
if (obj.Members.Count == 0)
return 1;
obj.Members.ForEach(x => hashCode ^= x);
return hashCode;
}
}
このコンパレータを使う:
static void Main(string[] args)
{
List<int> list = new List<int>() { 1, 2, 11, 222, 3, 4 };
List<int> list1 = new List<int>() { 1, 2, 11, 222, 3, 4 };
People p1 = new People() { Name = "Tony1", ID = 1, Age = 18, Members = list };
People p2 = new People() { Name = "Tony2", ID = 2, Age = 19, Members = list };
People p3 = new People() { Name = "Tony3", ID = 3, Age = 20, Members = list1 };
People p4 = new People() { Name = "Tony4", ID = 4, Age = 21, Members = new List<int>() };
List<People> personList = new List<People>() { p1, p2,p2,p3,p4 };
personList.Distinct(new PeopleComparedByListValue()).ToList().ForEach(x => Console.WriteLine(x));
Console.Read();
}
実行結果:配列値が1,2,11,222,3,4の残りは1つとなり、同じ値で繰り返される効果が見られます。
今後、3つまたは4つ以上の対象メンバーで対象が重複しているかどうかを決定する問題がある場合には、この方法を採用することができる。
以上は私の愚見です。このC〓〓〓はDispinctを実現して対象を条件によって重さに行きます。つまり、小編集はみんなのすべての内容に分かち合います。参考にしてほしいです。皆さんもよろしくお願いします。