2010-10-02 62 views
9

Il n'y a pas de fonction Sort() pour IList. Est-ce que someoene peut m'aider avec ça? Je veux trier mon propre IList.Comment trier IList <Class>?

Supposons ceci est mon IList:

public class MyObject() 
{ 
public int number { get; set; } 
public string marker { get; set; } 
} 

Comment puis-je trier en utilisant myobj la chaîne de marqueur?

public void SortObject() 
{ 
IList<MyObject> myobj = new List<MyObject>(); 
} 
+1

Est-ce que 'myobj' est toujours' List'? Si c'est le cas, vous pouvez le convertir en 'List' et lancer sa fonction' Sort'. – Gabe

Répondre

16

Utilisez OrderBy

Exemple

public class MyObject() 
{ 
    public int number { get; set; } 
    public string marker { get; set; } 
} 

IList<MyObject> myobj = new List<MyObject>(); 
var orderedList = myobj.OrderBy(x => x.marker).ToList(); 

Pour insensible à la casse, vous devez utiliser un IComparer

public class CaseInsensitiveComparer : IComparer<string> 
{ 
    public int Compare(string x, string y) 
    { 
     return string.Compare(x, y, StringComparison.OrdinalIgnoreCase); 
    } 
} 

IList<MyObject> myobj = new List<MyObject>(); 
var orderedList = myobj.OrderBy(x => x.marker, new CaseInsensitiveComparer()).ToList(); 
+0

Merci @Bruno cela aide. – Rye

+1

+1 pour tenir compte de la sensibilité à la casse, mais le Framework a déjà des comparateurs de chaînes insensibles à la casse, pas besoin d'en créer un. Essayez StringComparer.OrdinalIgnoreCase au lieu de votre CaseInsensitiveComparer. – Joe

0
var sorted = myObj.OrderBy(x => x.marker); 
0

OrderBy devient définitivement le travail, mais personnellement, je préfère la syntaxe de List.Sort parce que vous pouvez lui attribuer un délégué Comparison<T> au lieu d'avoir à écrire une classe qui implémente IComparer<T>. Nous pouvons atteindre cet objectif avec une méthode d'extension, et si c'est quelque chose qui vous intéresse, consultez SortExtensions:

http://blog.velir.com/index.php/2011/02/17/ilistt-sorting-a-better-way/

9

Je voudrais aller contre en utilisant OrderBy une liste, car il est une méthode d'extension LINQ Par conséquent:

  • Il encapsule la liste dans un énumérable, puis l'énumère et remplit une nouvelle liste temporaire, puis trie cette nouvelle liste.
  • Il encapsule la liste triée dans un autre énumérable.
  • Ensuite, lorsque vous appelez ToList(), il itère sur celui-ci et remplit une autre nouvelle liste avec les éléments.

Essentiellement: il crée et remplit 2 nouvelles listes et 2 énumérables en plus du tri réel. En comparaison, List.Sort() trie en place et ne crée rien donc c'est beaucoup plus efficace.

Ma recommandation serait:

  • Si vous connaissez le type sous-jacent, utilisez List.Sort() ou Array.Sort(array)
  • Si vous ne connaissez pas le type sous-jacent, copier la liste à un tableau temporaire et tri à l'aide Array.Sort(array) et le renvoyer.