2009-03-03 27 views
15

Benim Kod şöyle görünür: T özelliklerine göre List <T>'u nasıl sıralayabilirim?

Collection<NameValueCollection> optionInfoCollection = .... 
List<NameValueCollection> optionInfoList = new List<NameValueCollection>(); 
optionInfoList = optionInfoCollection.ToList(); 

if(_isAlphabeticalSoting) 
    Sort optionInfoList 

Ben optionInfoList.Sort çalıştı() ama çalışmıyor.

cevap

1

Sort() öğelerini nasıl düzenleyeceğini bildiren bir karşılaştırıcı kurmanız gerekir.

Kontrol dışarı Bunun nasıl bir örnek için List.Sort Method (IComparer) ... sıralama yöntemi ve lambda ifadeleri kullanma

27

, gerçekten kolaydır.

myList.Sort((a, b) => String.Compare(a.Name, b.Name)) 

Yukarıdaki örnekte, Ad türündeki dizenin olduğu varsayılarak, nesne türünüzün Name özelliği ile nasıl sıralanacağını gösterir.

+4

a.Name ise patlatmak hangi null ... –

+0

Sadece güvenli olacak string.Compare (a.Name, b.Name) kullanabilirsiniz? –

+0

Teşekkürler! Her gün yeni bir şeyler öğrenin ... Cevabı ben düzenleyeceğim. –

8

Sort()'un çalışmasını istiyorsanız, sınıfa IComparable veya IComparable<T> kodunu uygulamanız gerekir.

bir yeni listesi oluşturmayı sakıncası yoksa, OrderBy/ToList LINQ uzantısı yöntemleri kullanabilirsiniz. Eğer daha basit sözdizimi ile mevcut listeyi sıralamak isterseniz, sağlayan birkaç uzatma yöntemleri ekleyebilirsiniz: Örneğin

list.Sort(item => item.Name); 

:

public static void Sort<TSource, TValue>(
    this List<TSource> source, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y))); 
} 
public static void SortDescending<TSource, TValue>(
    this List<TSource> source, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    source.Sort((x, y) => comparer.Compare(selector(y), selector(x))); 
} 
+0

Bu uzantı yöntemlerini kullanmayla ilgili bir örneğiniz var, http://stackoverflow.com/questions/31057258/sort-list-of-dictionary-using-icomparer-instead-of-orderby sorumlusu için kullanmayı denedim, ancak önerdiğin yolu uygula –

2
public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

List<Person> people = new List<Person>(); 

people.Sort(
    delegate(Person x, Person y) { 
     if (x == null) { 
      if (y == null) { return 0; } 
      return -1; 
     } 
     if (y == null) { return 0; } 
     return x.FirstName.CompareTo(y.FirstName); 
    } 
); 
İlgili konular