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