อินเทอร์เฟซทั้งสองดูเหมือนจะเปรียบเทียบวัตถุเพื่อความเท่าเทียมกันดังนั้นความแตกต่างที่สำคัญระหว่างพวกเขาคืออะไร?
อินเทอร์เฟซทั้งสองดูเหมือนจะเปรียบเทียบวัตถุเพื่อความเท่าเทียมกันดังนั้นความแตกต่างที่สำคัญระหว่างพวกเขาคืออะไร?
คำตอบ:
IEquatable ทดสอบว่าวัตถุสองชิ้นเท่ากันหรือไม่
IComparable กำหนดลำดับรวมของวัตถุที่กำลังเปรียบเทียบ
ตัวอย่างเช่นIEquatableจะบอกคุณว่า 5 ไม่เท่ากับ 7 IComparableจะบอกคุณว่า 5 มาก่อน 7
IEquatable<T> เพื่อความเท่าเทียมกัน
IComparable<T> สำหรับการสั่งซื้อ
นอกเหนือจากคำตอบของ Greg D:
คุณอาจนำไปใช้IComparableโดยไม่ต้องใช้IEquatableสำหรับคลาสที่การสั่งซื้อบางส่วนเหมาะสมและในกรณีที่คุณต้องการให้ผู้บริโภคสรุปว่าเพียงเพราะCompareTo()ส่งคืนค่าศูนย์สิ่งนี้ไม่ได้หมายความว่าอ็อบเจ็กต์นั้นเท่ากัน (เพื่อวัตถุประสงค์อื่นนอกเหนือจากการเรียงลำดับ)
IComparableไม่เหมาะสมอย่างยิ่ง สิ่งที่คุณมีคือการสั่งซื้อที่เฉพาะเจาะจงซึ่งใช้เฉพาะในสถานการณ์พิเศษเพียงอย่างเดียว สำหรับสถานการณ์เช่นนี้การใช้งานทั่วไปIComparableเป็นสิ่งที่ผิด นี่คือสิ่งที่IComparerมีไว้สำหรับ ตัวอย่างเช่นไม่สามารถสั่งคนได้อย่างมีความหมาย แต่สามารถสั่งซื้อได้ตามเงินเดือนขนาดรองเท้าจำนวนฝ้ากระหรือน้ำหนัก ดังนั้นเราจะใช้IComparers ที่แตกต่างกันสำหรับกรณีเหล่านี้ทั้งหมด
ตามที่ระบุไว้ในMSDN Page สำหรับ IEquatable :
อินเทอร์เฟซ IComparable กำหนด
CompareToวิธีการซึ่งกำหนดลำดับการจัดเรียงของอินสแตนซ์ของประเภทการนำไปใช้งาน อินเทอร์เฟซ IEquatable กำหนดEqualsวิธีการซึ่งกำหนดความเท่าเทียมกันของอินสแตนซ์ของประเภทการนำไปใช้งาน
Equals เทียบกับ CompareTo
IComparable <T> กำหนดวิธีการเปรียบเทียบเฉพาะประเภทซึ่งสามารถใช้เพื่อสั่งซื้อหรือจัดเรียงวัตถุ
IEquatable <T> กำหนดวิธีการทั่วไปที่สามารถใช้ในการกำหนดความเท่าเทียมกัน
สมมติว่าคุณมีคลาส Person
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person p1 = new Person() { Name = "Person 1", Age = 34 };
Person p2 = new Person() { Name = "Person 2", Age = 31 };
Person p3 = new Person() { Name = "Person 3", Age = 33 };
Person p4 = new Person() { Name = "Person 4", Age = 26 };
List<Person> people = new List<Person> { p1, p2, p3, p4 };
people.Sort();ใช้ได้แต่สิ่งนี้จะทำให้เกิดข้อยกเว้น
Framework ไม่รู้ว่าจะเรียงลำดับวัตถุเหล่านี้อย่างไร คุณต้องบอกวิธีจัดเรียงIComparableอินเทอร์เฟซการใช้งาน
public class Person : IComparable
{
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(object obj)
{
Person otherPerson = obj as Person;
if (otherPerson == null)
{
throw new ArgumentNullException();
}
else
{
return Age.CompareTo(otherPerson.Age);
}
}
}
สิ่งนี้จะจัดเรียงอาร์เรย์อย่างถูกต้องด้วยSort()วิธีการ
Equals()วิธีการvar newPerson = new Person() { Name = "Person 1", Age = 34 };
var newPersonIsPerson1 = newPerson.Equals(p1);
สิ่งนี้จะกลับมาfalseเนื่องจากEqualsmethod ไม่ทราบวิธีเปรียบเทียบวัตถุสองชิ้น ดังนั้นคุณต้องใช้IEquatableอินเทอร์เฟซและบอกกรอบวิธีการเปรียบเทียบ ขยายจากตัวอย่างก่อนหน้านี้จะมีลักษณะเช่นนี้
public class Person : IComparable, IEquatable<Person>
{
//Some code hidden
public bool Equals(Person other)
{
if (Age == other.Age && Name == other.Name)
{
return true;
}
else
{
return false;
}
}
}
IEquatableใช้ทั่วไป<Person>และIComparableไม่?
IComparableอย่างถูกต้อง คุณสามารถหาตัวอย่างที่มีความหมายที่CompareTo(…) == 0ไม่ได้หมายความถึงความเท่าเทียมกันได้หรือไม่? ฉันทำไม่ได้อย่างแน่นอน ในความเป็นจริงสัญญาอินเทอร์เฟซ (ตาม MSDN) กำหนดให้CompareTo(…) == 0มีความเท่าเทียมกัน ที่จะนำมันโผงผางในกรณีเช่นคุณใช้พิเศษComparatorวัตถุไม่ได้IComparableดำเนินการ