ordenar nombres lista letras descendente alfabeticamente c# .net linq sorting

c# - nombres - Ordena una lista alfabéticamente



ordenar lista descendente c# (5)

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

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

Tengo la siguiente clase:

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

Actualmente ordeno la clase al azar usando lo 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 los detalles en orden alfabético.

Entonces, por ejemplo, si el contenido se ve así:

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

Quiero poder ejecutar este método y ordenarlo en:

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

¿Alguien sabe de una manera simple de 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.


De otra manera

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


Debería poder utilizar OrderBy en LINQ ...

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



Puede ordenar una lista in situ simplemente llamando a List<T>.Sort :

list.Sort();

Eso utilizará el orden natural de los elementos, lo cual está bien en su caso.

EDITAR: tenga en cuenta que en su código, necesitaría

_details.Sort();

ya que el método Sort solo está definido 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 de la List<T> es un detalle de implementación) necesitará hacer una un poco más de trabajo.

No conozco ningún tipo de IList<T> basado en .NET, lo cual es un poco extraño ahora que lo pienso. 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 te importa un poco la ineficiencia, siempre puedes usar:

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, copie, clasifique en su lugar, luego copie la lista ordenada.

Puede usar LINQ para crear una nueva lista que contenga los valores originales pero ordenados:

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

Depende del comportamiento que desee. Tenga en cuenta que su método de mezcla no es realmente ideal:

  • Crear un nuevo Random dentro del método se encuentra con algunos de los problemas que se muestran aquí
  • Puedes declarar val dentro del ciclo, no estás usando ese valor predeterminado
  • Es más idiomático usar la propiedad Count cuando sabes que estás trabajando con un IList<T>
  • En mi opinión, un bucle for es más fácil de entender que atravesar la lista hacia atrás con un ciclo while

Hay otras implementaciones de barajar con Fisher-Yates en - search y encontrarás una muy rápidamente.