อินเทอร์เฟซทั้งสองดูเหมือนจะเปรียบเทียบวัตถุเพื่อความเท่าเทียมกันดังนั้นความแตกต่างที่สำคัญระหว่างพวกเขาคืออะไร?
อินเทอร์เฟซทั้งสองดูเหมือนจะเปรียบเทียบวัตถุเพื่อความเท่าเทียมกันดังนั้นความแตกต่างที่สำคัญระหว่างพวกเขาคืออะไร?
คำตอบ:
IEquatable
ทดสอบว่าวัตถุสองชิ้นเท่ากันหรือไม่
IComparable
กำหนดลำดับรวมของวัตถุที่กำลังเปรียบเทียบ
ตัวอย่างเช่นIEquatable
จะบอกคุณว่า 5 ไม่เท่ากับ 7 IComparable
จะบอกคุณว่า 5 มาก่อน 7
IEquatable<T>
เพื่อความเท่าเทียมกัน
IComparable<T>
สำหรับการสั่งซื้อ
นอกเหนือจากคำตอบของ Greg D:
คุณอาจนำไปใช้IComparable
โดยไม่ต้องใช้IEquatable
สำหรับคลาสที่การสั่งซื้อบางส่วนเหมาะสมและในกรณีที่คุณต้องการให้ผู้บริโภคสรุปว่าเพียงเพราะCompareTo()
ส่งคืนค่าศูนย์สิ่งนี้ไม่ได้หมายความว่าอ็อบเจ็กต์นั้นเท่ากัน (เพื่อวัตถุประสงค์อื่นนอกเหนือจากการเรียงลำดับ)
IComparable
ไม่เหมาะสมอย่างยิ่ง สิ่งที่คุณมีคือการสั่งซื้อที่เฉพาะเจาะจงซึ่งใช้เฉพาะในสถานการณ์พิเศษเพียงอย่างเดียว สำหรับสถานการณ์เช่นนี้การใช้งานทั่วไปIComparable
เป็นสิ่งที่ผิด นี่คือสิ่งที่IComparer
มีไว้สำหรับ ตัวอย่างเช่นไม่สามารถสั่งคนได้อย่างมีความหมาย แต่สามารถสั่งซื้อได้ตามเงินเดือนขนาดรองเท้าจำนวนฝ้ากระหรือน้ำหนัก ดังนั้นเราจะใช้IComparer
s ที่แตกต่างกันสำหรับกรณีเหล่านี้ทั้งหมด
ตามที่ระบุไว้ใน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
เนื่องจากEquals
method ไม่ทราบวิธีเปรียบเทียบวัตถุสองชิ้น ดังนั้นคุณต้องใช้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
ดำเนินการ