c# - nombres - Ordena una lista alfabéticamente
ordenar lista descendente c# (5)
¿Qué pasa con List<T>.Sort()
?
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);
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
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 unIList<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.