2009-03-03 5 views
15

mio codice è simile al seguente:Come si ordina l'elenco <T> in base alle proprietà di T?

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

if(_isAlphabeticalSoting) 
    Sort optionInfoList 

ho cercato optionInfoList.Sort(), ma non funziona.

risposta

1

È necessario impostare un comparatore che indichi a Sort() come disporre gli articoli.

Partenza List.Sort Method (IComparer) per un esempio di come fare questo ...

27

Utilizzando le espressioni metodo di ordinamento e lambda, è davvero facile.

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

L'esempio sopra mostra come ordinare dalla struttura Nome del tuo tipo di oggetto, assumendo nome è di tipo stringa.

+4

Che farà saltare in aria se è a.Name null ... –

+0

Si potrebbe semplicemente usare string.Compare (a.Name, b.Name), che sarebbe sicuro? –

+0

Grazie! Impara qualcosa di nuovo ogni giorno ... Modificherò la risposta. –

8

Se si desidera solo il Sort() per funzionare, è necessario implementare IComparable o IComparable<T> nella classe.

Se non ti dispiace la creazione di un nuovo elenco , è possibile utilizzare i metodi di estensione LINQ OrderBy/ToList. Se si desidera ordinare l'elenco esistente con la sintassi più semplice, è possibile aggiungere un paio di metodi di estensione, consentendo:

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

Ad esempio:

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

Hai un esempio di utilizzo di questi metodi di estensione, ho provato a utilizzare per la mia domanda http://stackoverflow.com/questions/31057258/sort-list-of-dictionary-using-icomparer-instead-of-orderby, ma couldn implementare il modo in cui hai suggerito –

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); 
    } 
);