2010-10-02 10 views
9

Nie ma funkcji Sort() dla IList. Czy ktoś może mi w tym pomóc? Chcę posortować własne ILIST.Jak mogę sortować ILIST <Class>?

Załóżmy, to jest mój IList:

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

Jak sortować myObj pomocą markera ciąg?

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

Czy 'myobj' zawsze jest' List'? Jeśli tak, możesz rzucić go na listę 'List' i uruchomić funkcję' Sortuj'. – Gabe

Odpowiedz

16

Zastosowanie OrderBy

Przykład

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

Dla przypadku nieczuły należy użyć 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

Dzięki @Bruno to pomaga. – Rye

+1

+1 do uwzględniania rozróżniania wielkości liter, ale w programie ramowym nie są już uwzględniane wielkości liter porównania, nie ma potrzeby tworzenia ich. Wypróbuj StringComparer.OrdinalIgnoreCase zamiast CaseInsensitiveComparer. – Joe

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

OrderBy pewno dostaje zadanie, ale ja osobiście wolę składnię List.Sort, ponieważ można go przekazać delegatowi Comparison<T>, zamiast pisać klasę, która implementuje IComparer<T>. Możemy osiągnąć ten cel z metodę rozszerzenia, a jeśli to jest coś, że jesteś zainteresowany, sprawdź SortExtensions:

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

9

pójdę przeciwko użyciu OrderBy z listy, ponieważ jest to metoda rozszerzenie LINQ , dlatego:

  • Zawija listę w wyliczeniu, a następnie wylicza i wypełnia nową listę tymczasową, a następnie sortuje tę nową listę.
  • Zawija posortowaną listę wewnątrz innego przelicznika.
  • Następnie, po wywołaniu ToList(), iteruje na nim i wypełnia kolejną nową listę elementami.

W istocie: tworzy i wypełnia 2 nowe listy i 2 wyliczenia oprócz faktycznego sortowania. W porównaniu, List.Sort() sortuje w miejscu i nic nie tworzy, dzięki czemu jest bardziej wydajna.

Moja rekomendacja byłoby:

  • Jeśli znasz typ podstawowy, użyj List.Sort() lub Array.Sort(array)
  • Jeśli nie znasz typu bazowego, skopiuj List do tablicy tymczasowej i sortować je przy użyciu Array.Sort(array) i zwróć go.
Powiązane problemy