ใช้IEqualityComparer<T>
( EqualityComparer<T>.Default
เว้นแต่คุณจะระบุสิ่งที่แตกต่างในการก่อสร้าง)
เมื่อคุณเพิ่มองค์ประกอบลงในชุดจะพบรหัสแฮชโดยใช้IEqualityComparer<T>.GetHashCode
และจัดเก็บทั้งรหัสแฮชและองค์ประกอบ (หลังจากตรวจสอบว่าองค์ประกอบนั้นอยู่ในชุดแล้วหรือไม่)
ในการค้นหาองค์ประกอบขั้นแรกจะใช้IEqualityComparer<T>.GetHashCode
เพื่อค้นหารหัสแฮชจากนั้นสำหรับองค์ประกอบทั้งหมดที่มีรหัสแฮชเดียวกันจะใช้IEqualityComparer<T>.Equals
เพื่อเปรียบเทียบเพื่อความเท่าเทียมที่แท้จริง
นั่นหมายความว่าคุณมีสองทางเลือก:
- ส่งผ่านแบบกำหนดเอง
IEqualityComparer<T>
ไปยังตัวสร้าง นี่เป็นตัวเลือกที่ดีที่สุดหากคุณไม่สามารถแก้ไขT
ตัวเองได้หรือหากคุณต้องการความสัมพันธ์แบบไม่เป็นค่าเริ่มต้น (เช่น "ผู้ใช้ทั้งหมดที่มี ID ผู้ใช้ติดลบจะถือว่าเท่ากัน") สิ่งนี้แทบจะไม่เคยใช้กับประเภทตัวเองเลย (เช่นFoo
ไม่ได้ใช้งานIEqualityComparer<Foo>
) แต่เป็นประเภทแยกต่างหากซึ่งใช้สำหรับการเปรียบเทียบเท่านั้น
- ใช้ความเท่าเทียมกันในรูปแบบของตัวเองโดยการเอาชนะและ
GetHashCode
Equals(object)
ตามIEquatable<T>
หลักการแล้วให้ใช้งานในประเภทด้วยโดยเฉพาะอย่างยิ่งถ้าเป็นประเภทค่า วิธีการเหล่านี้จะถูกเรียกโดยตัวเปรียบเทียบค่าเริ่มต้นของความเท่าเทียมกัน
สังเกตว่าสิ่งนี้ไม่ได้อยู่ในแง่ของการเปรียบเทียบแบบเรียงลำดับ - ซึ่งสมเหตุสมผลเนื่องจากมีสถานการณ์ที่คุณสามารถระบุความเท่าเทียมกันได้อย่างง่ายดาย แต่ไม่ใช่การสั่งซื้อทั้งหมด ทั้งหมดนี้เหมือนกับDictionary<TKey, TValue>
โดยทั่วไป
หากคุณต้องการชุดที่ใช้การสั่งซื้อแทนการเปรียบเทียบความเท่าเทียมกันคุณควรใช้SortedSet<T>
จาก. NET 4 - ซึ่งช่วยให้คุณระบุ a IComparer<T>
แทนIEqualityComparer<T>
ไฟล์. นี้จะใช้IComparer<T>.Compare
- ซึ่งจะมอบหมายให้IComparable<T>.CompareTo
หรือถ้าคุณกำลังใช้IComparable.CompareTo
Comparer<T>.Default
IEqualityComparer<T>
msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspxa