您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Equals與GetHashCode如何在C#中使用,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
Equals和GetHashCode
Equals每個實現都必須遵循以下約定:
自反性(Reflexive): x.equals(x)必須返回true.
對稱性(Symmetric): x.equals(y)為true時,y.equals(x)也為true.
傳遞性(Transitive): 對于任何非null的應用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)必須返回true.
一致性(Consistence): 如果多次將對象與另一個對象比較,結果始終相同.只要未修改x和y的應用對象,x.equals(y)連續調用x.equals(y)返回相同的值l.
非null(Non-null): 如果x不是null,y為null,則x.equals(y)必須為false
GetHashCode:
兩個相等對象根據equals方法比較時相等,那么這兩個對象中任意一個對象的hashcode方法都必須產生同樣的整數。
在我們未對對象進行修改時,多次調用hashcode使用返回同一個整數.在同一個應用程序中多次執行,每次執行返回的整數可以不一致.
如果兩個對象根據equals方法比較不相等時,那么調用這兩個對象中任意一個對象的hashcode方法,不一同的整數。但不同的對象,產生不同整數,有可能提高散列表的性能.
IEqualityComparer實現
下面我們創建一個學生類,從而進一步的實現我們對象數據的對比
public class Student { public string Name { get; set; } public int Age { get; set; } }
通過如下代碼我們將通過distinct方法實現我們的過濾.
class Program { static void Main(string[] args) { List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count());//distinctStudents has Count = 3 Console.ReadLine(); } }
我們需要達到的是忽略相同數據的對象,但是并沒有達到我們如期的效果.因為是distinct默認比較的是對象的引用...所以這樣達不到我們預期效果.那我們修改一下來實現我們預期效果.
在默認情況下Equals具有以下行為:
如果實例是引用類型,則只有引用相同時, Equals才會返回true。
如果實例是值類型,則僅當類型和值相同時, Equals才會返回true。
Distinct(IEnumerable, IEqualityComparer)
通過使用指定的 IEqualityComparer 對值進行比較,返回序列中的非重復元素.
類型參數
TSource source 的元素類型。
參數
source IEnumerable 要從中移除重復元素的序列。
comparer IEqualityComparer 用于比較值的 IEqualityComparer。
返回
IEnumerable
一個包含源序列中的非重復元素的 IEnumerable。
我們來看如下代碼片段
public class StudentComparator : EqualityComparer<Student> { public override bool Equals(Student x,Student y) { return x.Name == y.Name && x.Age == y.Age; } public override int GetHashCode(Student obj) { return obj.Name.GetHashCode() * obj.Age; } }
上述代碼片段如果兩個Equals返回的true并且GetHashCode返回相同的哈希碼,則認為兩個對象相等.
重寫Equals和GetHashCode
var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //false because it's reference Equals
上述代碼片段執行后結果非預期效果.我們將進一步的去實現代碼,以達到預期效果....
public class Student { public string Name { get; set; } public int Age { get; set; } public override bool Equals(object obj) { var stu = obj as Student; if (stu == null) return false; return Name == stu.Name && Age == stu.Age; } public override int GetHashCode() { return Name.GetHashCode() * Age; } } var stu1 = new Student { Name = "MR.A", Age = 32 }; var stu2 = new Student { Name = "MR.A", Age = 32 }; bool result = stu1.Equals(stu2); //result is true
我們再使用LINQ Distinct方法進行過濾和查詢,同時將會檢查Equals和GetHashCode
List<Student> students = new List<Student> { new Student{ Name = "MR.A", Age = 32}, new Student{ Name = "MR.B", Age = 34}, new Student{ Name = "MR.A", Age = 32} }; Console.WriteLine("distinctStudents has Count = {0}", students.Distinct().Count()); //distinctStudents has Count = 2
看完上述內容,你們對Equals與GetHashCode如何在C#中使用有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。