IComparable sadece tek yönlü çalışır
Diyelim ki bir dersiniz var Employee. Bir görünümde, tüm Employeesadları ada göre sıralanmış olarak, diğerinde, adrese göre göstermek istersiniz . Bunu nasıl başaracaksınız? Değil ile IComparableen azından hiçbir deyimsel bir şekilde.
IComparable mantığı yanlış yerde tutmak
Arayüz çağrılarak kullanılır .Sort(). Ada göre Customersıralanmış bir görünümde , nasıl sıralanacağını gösteren hiçbir kod yoktur.
Öte yandan Customersı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 Customersı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ü, IComparablehala 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. IComparable2 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 IComparableda 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
IComparableartık kullanmazsınız ki bu benim açımdan pekiştiriyor.
SortedXXXKoleksiyonları kullanırsanız , saklanan öğelerin olmasını IComparableveya 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 IComparablenesnelerle çalışmasını sağlamanın önemsiz olduğunu unutmayın .
IComparableolarak 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