標籤:
實際項目中經常用到 Union,Distinct,INtersect,Execpt對列表進行處理
一般來說要首先重寫 Equals 和GetHashCode方法
首先看為重寫的情況:
namespace LinqCookBook{ class Program { static void Main(string[] args) { var model1 = new List<model> { new model(){name = "1"}, new model(){name="2"}, new model(){name = "3"} }; var model2 = new List<model> { new model() {name = "1"}, new model() {name = "2"}, new model() {name = "3"} }; var list = model1.Union(model2).Distinct(); foreach (var item in list) { Console.WriteLine(item.name); } } } public class model { public string name { get; set; } //public override bool Equals(object obj) //{ // return obj.GetHashCode().Equals(this.GetHashCode()); //} //public override int GetHashCode() //{ // return this.name.GetHashCode(); //} }}
運行結果:
重寫後:
namespace LinqCookBook{ class Program { static void Main(string[] args) { var model1 = new List<model> { new model(){name = "1"}, new model(){name="2"}, new model(){name = "3"} }; var model2 = new List<model> { new model() {name = "1"}, new model() {name = "2"}, new model() {name = "3"} }; var list = model1.Union(model2).Distinct(); foreach (var item in list) { Console.WriteLine(item.name); } } } public class model { public string name { get; set; } public override bool Equals(object obj) { return obj.GetHashCode().Equals(this.GetHashCode()); } public override int GetHashCode() { return this.name.GetHashCode(); } }}
運行結果:
原因:
當元素比較時,會使用預設規則比較,通過equals和gethashcode來確定應用類的一個執行個體和另一個執行個體是否相同。通常是不相同的,因為他們指向了不同的記憶體位址,導致雜湊值是不同的。重寫以後,認為某些屬性值相同則認為相同。
c# cook book -Linq 關於Object的比較