2010-12-21 9 views
13

Üç alana sahip bir kişi sınıfım var, Başlık, İsim, Cinsiyet ve Önce Başlığa göre sıralamak için Özel Sıralama, ardından Ad ve ardından Cinsiyete göre artan:Özel Sıralama (Üç alanda IComparer)

public class SortPerson : IComparer 
    { 
     public int Compare(object x, object y) 
     { 
      (…) 
     } 
    } 

Ben karşılaştırmak için tek değişken için bunun nasıl biliyorum: Ama nasıl üçe ile devam etmek zorunda kalacak?

public class SortPerson : IComparer 
     { 

int IComparer.Compare(object a, object b) 
    { 
     Person p1=(Person)a; 
     Person p2=(Person)b; 
     if (p1.Title > p2.Title) 
     return 1; 
     if (p1.Title < p2.Title) 
     return -1; 
     else 
     return 0; 
    } 
} 

Birçok sayesinde

+2

Ne yapmalısınız? Bir alan doğal olarak daha önemli olmalı, doğru mu? Sonra bir başkası? Ve son olarak ne oldu? Yani ilk alanı karşılaştırın. Bu sonuç 0 ise, o zaman ikinci karşılaştırın. Bu sonuç 0 ise, üçüncü karşılaştırın. Sonucu döndür. Bunu bir yönteme çevir ve bir başlangıç ​​yap. Ardından, refactor. –

cevap

28
//Assuming all the fields implement IComparable 
int result = a.field1.CompareTo(b.field1); 
if (result == 0) 
    result = a.field2.CompareTo(b.field2); 
if (result == 0) 
    result = a.field3.CompareTo(b.field3); 
return result; 
4

Ben karşılaştırıcısı için sahip faydası bilmiyorum, ama belki bir karşılaştırıcısı çeşitli alanlarda göre sıralamak için izin verir LINQ ifadesi, "order by" yerine kullanabilirsiniz:

var orderedListPersons = 
    from p in listPersons 
    orderby p.Title, p.Name, p.Gender 
    select person; 

, listeyi istediğiniz gibi gönderecektir. LINQ OrderBy ve ThenBy yöntemlerini aynı şey için farklı bir sözdizimi ile de kullanabilirsiniz:

var orderedlistPersons = listPersons.OrderBy(p => p.Title).ThenBy(p => p.Name).ThenBy(p => p.Gender);