2011-08-06 30 views
50

tengo la clase siguiente:ordenar una lista por orden alfabético

class Detail 
{ 
    public Detail() 
    { 
     _details = new List<string>(); 
    } 
    public IList<string> Details { get { return _details; } } 
    private readonly List<string> _details; 
} 

Actualmente en cierto modo me la clase al azar usando la siguiente:

void ShuffleGenericList<T>(IList<T> list) 
{ 
    //generate a Random instance 
    var rnd = new Random(); 
    //get the count of items in the list 
    var i = list.Count(); 
    //do we have a reference type or a value type 
    T val = default(T); 

    //we will loop through the list backwards 
    while (i >= 1) 
    { 
     //decrement our counter 
     i--; 
     //grab the next random item from the list 
     var nextIndex = rnd.Next(i, list.Count()); 
     val = list[nextIndex]; 
     //start swapping values 
     list[nextIndex] = list[i]; 
     list[i] = val; 
    } 
} 

Lo que me gustaría hacer es ordenar el contenido de detalles en orden alfabético

Así por ejemplo, si el contenido el siguiente aspecto:

[0] a 
[1] d 
[2] b 

Quiero ser capaz de ejecutar este método y hacer que se clasifican en:

[0] a 
[1] b 
[2] d 

¿Alguien sabe de una manera sencilla ¿para hacer esto? Tenga en cuenta que las listas generalmente tienen menos de diez entradas en ellos. ¿Puedo hacer esto con LINQ? Lo siento pero no estoy muy familiarizado con LINQ. Acabo de escuchar una sugerencia de que podría usar eso.

Respuesta

105

Puede ordenar una lista en el lugar simplemente llamando List<T>.Sort:

list.Sort(); 

que utilizará lo natural ordenamiento de elementos, lo cual está bien en su caso.

EDIT: Tenga en cuenta que en su código, que había necesidad

_details.Sort(); 

como el método Sort sólo se define en List<T>, no IList<T>. Si necesita ordenarlo desde el exterior donde no tiene acceso como List<T> (no debe convertirlo ya que la parte List<T> es un detalle de implementación) necesitará hacer un poco más de trabajo.

No sé de cualquier IList<T> -basado en el lugar tipo en .NET, que es un poco extraño ahora que lo pienso de ella. IList<T> proporciona todo lo que necesita, por lo que podría escribirse como un método de extensión. Hay muchas implementaciones de solución rápida si quiere usar una de esas.

Si no se preocupan por un poco de ineficiencia, siempre se puede utilizar:

public void Sort<T>(IList<T> list) 
{ 
    List<T> tmp = new List<T>(list); 
    tmp.Sort(); 
    for (int i = 0; i < tmp.Count; i++) 
    { 
     list[i] = tmp[i]; 
    } 
} 

En otras palabras, copiar, ordenar en su lugar, entonces copiar la lista ordenada de vuelta.


Puede utilizar LINQ para crear una lista nueva que contiene los valores originales, pero ordenadas:

var sortedList = list.OrderBy(x => x).ToList(); 

Depende cual el comportamiento que desea.Tenga en cuenta que el método de reproducción aleatoria no es realmente ideal:

  • Creación de una nueva Random dentro del método se ejecuta en algunos de los problemas shown here
  • Se puede declarar val dentro del bucle - no estás usando que valor predeterminado
  • es más idiomática a utilizar la propiedad Count cuando sabe que está trabajando con un IList<T>
  • en mi opinión, un for bucle es más sencillo de entender que recorrer la lista hacia atrás con un lazo while

Hay otras implementaciones de arrastrar los pies con Fisher-Yates desbordamiento de pila - búsqueda y se encuentra uno con bastante rapidez.

+0

Entonces, si quisiera ordenar la lista que creó anteriormente, ¿solo tendría que decir: sortedList.Sort? – Mariko

+0

Probé la ordenación pero no puedo conseguir que funcione. Mi lista es así: IList nD. Intenté nD.Sort() pero dice: No puedo resolver el símbolo 'Ordenar'. – Mariko

+0

@Mariko: Use '_details.Sort()' en su lugar, ya que '_details' se declara como' List 'en lugar de' IList '. 'Sort' solo se declara en' List ', no' IList '. –

11

Usted debe ser capaz de utilizar OrderBy en LINQ ...

var sortedItems = myList.OrderBy(s => s); 
+1

Nota: que devuelve 'IEnumerable ' y no está en orden ordenar – abatishchev

1

¿Qué ocurre con List<T>.Sort()?

http://msdn.microsoft.com/en-us/library/3da4abas.aspx

+0

@goril - Me gustaría usar esto pero me sale un error. Esto es lo que agregué al otro comentario. Espero que puedas ayudar. Mi lista se ve así: IList nD. Intenté nD.Sort() pero dice: No puedo resolver el símbolo 'Ordenar'. – Mariko

+1

@Mariko: utiliza la interfaz IList que no contiene el método Sort. Sort List variable directamente. En otras palabras, puede ordenar '_details' de su ejemplo pero no' Details' –

14

Hay dos maneras:

Sin LINQ: yourList.Sort();

Con LINQ: yourList.OrderBy(x => x).ToList()

Encontrará más información en: http://www.dotnetperls.com/sort-string-array

+0

@Dminox - Mi lista se ve así: IList nD. Intenté nD.Sort() pero dice: No puedo resolver el símbolo 'Ordenar'. – Mariko

+1

@Mariko 'Sort()' es un miembro de 'List ' * not * 'IList '. Puede considerar cambiar al primero (a menos que espere estar trabajando con diferentes implementaciones 'IList '.) – dlev

+0

La respuesta correcta. –

11

Otra forma

_details.Sort((s1, s2) => s1.CompareTo(s2)); 
+5

Éste tiene la ventaja de adaptarse a ** ordenar cualquier objeto por una de sus propiedades **. – MGOwen

Cuestiones relacionadas