IComparable
ใช้งานได้ทางเดียวเท่านั้น
สมมติว่าคุณมีEmployee
ชั้นเรียน ในมุมมองหนึ่งคุณต้องการแสดงทั้งหมดEmployees
เรียงตามชื่อ - ในอีกมุมมองตามที่อยู่ คุณจะประสบความสำเร็จได้อย่างไร ไม่อยู่กับIComparable
อย่างน้อยก็ไม่มีทางที่เป็นไปได้
IComparable
มีเหตุผลในสถานที่ที่ไม่ถูกต้อง
.Sort()
อินเตอร์เฟซที่ถูกนำมาใช้โดยการเรียก ในมุมมองที่แสดงCustomer
เรียงตามชื่อไม่มีรหัสเลยที่จะบอกว่ามันจะถูกเรียงลำดับอย่างไร
ในทางกลับกันCustomer
คลาสจะสมมติว่ามันจะถูกใช้อย่างไรในกรณีนี้มันจะถูกใช้ในรายการเรียงตามชื่อ
IComparable
มีการใช้งานโดยปริยาย
ในการเปรียบเทียบกับทางเลือกมันเป็นเรื่องยากมากที่จะเห็นว่ามีการใช้ตรรกะการเปรียบเทียบหรือไม่ สมมติว่า IDE มาตรฐานของคุณและเริ่มจากCustomer
ชั้นเรียนฉันจะต้อง
- ค้นหาการอ้างอิงทั้งหมดถึง
Customer
- ค้นหาการอ้างอิงเหล่านั้นที่ใช้ในรายการ
- ตรวจสอบว่ารายการเหล่านั้นเคย
.Sort()
เรียกพวกเขา
มีอะไรที่แย่กว่านั้นถ้าคุณลบการIComparable
ใช้งานที่ยังคงใช้อยู่คุณจะไม่ได้รับข้อผิดพลาดหรือคำเตือน สิ่งเดียวที่คุณจะได้รับคือพฤติกรรมที่ไม่ถูกต้องในทุกสถานที่ที่คลุมเครือเกินกว่าที่คุณจะนึกถึง
ปัญหาเหล่านี้รวมกันรวมถึงข้อกำหนดที่เปลี่ยนแปลง
เหตุผลที่ฉันมาคิดเรื่องนี้ก็เพราะมันผิดสำหรับฉัน ฉันมีความสุขที่ใช้IComparable
ในใบสมัครของฉันเป็นเวลา 2 ปีแล้ว ตอนนี้ความต้องการเปลี่ยนแปลงและสิ่งที่ต้องเรียงลำดับใน 2 วิธีที่แตกต่างกัน สังเกตว่าไม่มีความสนุกที่ทำตามขั้นตอนที่อธิบายไว้ในส่วนก่อนหน้า
คำถาม
ปัญหาเหล่านี้ทำให้ฉันคิดว่าIComparable
เป็นด้อยกว่าIComparer
หรือ.OrderBy()
จนถึงจุดที่ไม่เห็นกรณีการใช้งานที่ถูกต้องที่จะไม่ได้รับการบริการที่ดีขึ้นโดยทางเลือกที่
จะดีกว่าเสมอที่จะใช้IComparer
หรือ LINQ หรือมีข้อดี / กรณีการใช้งานที่ฉันไม่เห็นที่นี่?
IComparable
อีกต่อไปซึ่งเป็นการตอกย้ำประเด็นของฉัน
SortedXXX
คอลเลกชันพวกเขาอาจต้องการองค์ประกอบที่เก็บไว้เพื่อให้IComparable
หรือมีIComparer
ให้ นอกจากนี้โปรดทราบว่ามันเป็นเรื่องเล็กน้อยที่จะกลับลำดับการเรียงตามธรรมชาติกับผู้เปรียบเทียบรายหนึ่งและทำงานกับIComparable
วัตถุทั้งหมดได้
IComparable
ถือเป็นกลไกการเปรียบเทียบ เริ่มต้น IComparer
จะใช้เมื่อคุณต้องการแทนที่กลไกการเปรียบเทียบเริ่มต้น
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634