2010-10-02 17 views
9

No hay función Sort() para IList. ¿Puede alguien ayudarme con esto? Quiero clasificar mi propio IList.¿Cómo clasifico IList <Class>?

Supongamos que este es mi IList:

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

¿Cómo puedo ordenar myObj utilizando la cadena de marcador?

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

¿Es 'myobj' siempre una' Lista'? Si es así, puedes convertirlo a una 'Lista' y ejecutar su función 'Ordenar'. – Gabe

Respuesta

16

Uso OrderBy

Ejemplo

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

Para un caso insensibles se debe utilizar 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

Gracias @Bruno esto ayuda. – Rye

+1

+1 para considerar la distinción entre mayúsculas y minúsculas, pero el Framework ya tiene comparadores de cadenas que no distinguen entre mayúsculas y minúsculas, no es necesario crear uno. Pruebe StringComparer.OrdinalIgnoreCase en lugar de CaseInsensitiveComparer. – Joe

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

OrderBy definitivamente se hace el trabajo, pero personalmente prefiero la sintaxis de List.Sort porque puede alimentarlo como un delegado Comparison<T> en lugar de tener que escribir una clase que implemente IComparer<T>. Podemos lograr esa meta con un método de extensión, y si eso es algo que le interesa, echa un vistazo a SortExtensions:

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

9

me gustaría ir contra usando OrderBy con una lista porque es un método de extensión de LINQ , por lo tanto:

  • Envuelve la lista en un enumerable, luego lo enumera y llena una nueva lista temporal, luego ordena esta nueva lista.
  • Envuelve la lista ordenada dentro de otro enumerable.
  • Luego, cuando llame al ToList(), lo repite y completa otra lista nueva con los elementos.

En esencia: crea y llena 2 nuevas listas y 2 enumerables además de la clasificación real. En comparación, List.Sort() se ordena y no crea nada por lo que es mucho más eficiente.

Mi recomendación sería:

  • Si conoce el tipo subyacente, utilice List.Sort() o Array.Sort(array)
  • Si no conoce el tipo subyacente, copiar la lista a una matriz temporal y ordenarla usando Array.Sort(array) y devolverlo.
Cuestiones relacionadas