ใช้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.CompareToComparer<T>.Default
IEqualityComparer<T>msdn.microsoft.com/en-us/library/bb301504(v=vs.110).aspxa