2009-03-03 6 views
15

Mon code ressemble à ceci:Comment puis-je trier la liste <T> en fonction des propriétés de T?

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

if(_isAlphabeticalSoting) 
    Sort optionInfoList 

J'ai essayé optionInfoList.Sort(), mais il ne fonctionne pas.

Répondre

1

Vous devez configurer un comparateur qui indique à Sort() comment organiser les éléments.

Découvrez List.Sort Method (IComparer) un exemple de comment faire ...

27

En utilisant les expressions de la méthode de tri et lambda, il est vraiment facile. L'exemple ci-dessus montre comment trier par la propriété Name de votre type d'objet, en supposant que Name soit de type string.

+4

qui va exploser si a.Name est null ... –

+0

Vous pouvez simplement utiliser string.Compare (a.Name, b.Name), ce qui serait sûr? –

+0

Merci! Apprenez quelque chose de nouveau tous les jours ... Je vais modifier la réponse. –

8

Si vous souhaitez que Sort() fonctionne, vous devez implémenter IComparable ou IComparable<T> dans la classe.

Si vous ne me dérange pas de créer une nouvelle liste , vous pouvez utiliser les OrderBy/ToList méthodes d'extension LINQ. Si vous voulez trier la liste existante avec une syntaxe plus simple, vous pouvez ajouter quelques méthodes d'extension, ce qui permet:

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

Par exemple:

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

Avez-vous un exemple d'utilisation de ces méthodes d'extension, j'ai essayé d'utiliser pour ma question http://stackoverflow.com/questions/31057258/sort-list-of-dictionary-using-icomparer-instead-of-orderby, mais couldn pas mettre en œuvre comme vous l'avez suggéré –

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