IComparable
sadece tek yönlü çalışır
Diyelim ki bir dersiniz var Employee
. Bir görünümde, tüm Employees
adları ada göre sıralanmış olarak, diğerinde, adrese göre göstermek istersiniz . Bunu nasıl başaracaksınız? Değil ile IComparable
en azından hiçbir deyimsel bir şekilde.
IComparable
mantığı yanlış yerde tutmak
Arayüz çağrılarak kullanılır .Sort()
. Ada göre Customer
sıralanmış bir görünümde , nasıl sıralanacağını gösteren hiçbir kod yoktur.
Öte yandan Customer
sınıf, nasıl kullanılacağını varsayar - bu durumda, isimlere göre sıralanmış bir listede kullanılacağını.
IComparable
dolaylı olarak kullanılır
Alternatiflerle karşılaştırıldığında, karşılaştırma mantığının nerede kullanıldığını veya hiç olup olmadığını görmek çok zordur. Standart IDE'nizi varsayarak ve Customer
sınıftan başlayarak,
- İçin tüm referansları ara
Customer
- Listede kullanılan referansları bulma
- Bu listelerin hiç
.Sort()
çağrılıp çağrılmadığını kontrol edin
Daha da kötüsü, IComparable
hala kullanılmakta olan bir uygulamayı kaldırırsanız hata veya uyarı almazsınız. Alacağınız tek şey, düşünmeniz için çok karanlık olan her yerde yanlış davranış.
Bu sorunlar bir araya geldi ve değişen gereksinimler
Bunu düşünmeye başlamamın nedeni, benim için yanlış gitti. IComparable
2 yıldır mutlu bir şekilde başvurumda kullanıyorum . Şimdi, gereksinimler değişti ve şeyin 2 farklı şekilde sıralanması gerekiyor. Önceki bölümde açıklanan adımlardan geçmenin eğlenceli olmadığını fark ettim.
Soru
Bu konular beni alternatifler tarafından daha iyi sunulmayacak geçerli bir kullanım durumu görmüyor ya IComparable
da aşağı görmüyor. LINQ kullanmak her zaman daha mı iyidir , yoksa burada görmediğim avantajlar / kullanım durumları var mı?IComparer
.OrderBy()
IComparer
IComparable
artık kullanmazsınız ki bu benim açımdan pekiştiriyor.
SortedXXX
Koleksiyonları kullanırsanız , saklanan öğelerin olmasını IComparable
veya sağlanmasını gerektirdiklerini unutmayın IComparer
. Ayrıca, doğal sıralama düzenini tek bir karşılaştırıcıyla tersine çevirmenin ve tüm IComparable
nesnelerle çalışmasını sağlamanın önemsiz olduğunu unutmayın .
IComparable
olarak kabul edilir . , varsayılan karşılaştırma mekanizmasını geçersiz kılmak istediğinizde kullanılır. IComparer
ReverseComparer<T>
: gist.github.com/jackfarrington/078e7af7bc82482aa634