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 ordenar la clase al azar utilizando 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 los detalles en orden alfabético.

Así, por ejemplo, si el contenido de este aspecto:

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

Quiero ser capaz de ejecutar este método y los han clasificado en:

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

¿Alguien sabe de una manera simple de hacer esto? Tenga en cuenta que las listas suelen tener 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 que podría usarlo.

InformationsquelleAutor Mariko | 2011-08-06

5 Comentarios

  1. 133

    Usted puede ordenar una lista en el lugar simplemente llamando Lista de<T>.Tipo:

    list.Sort();

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

    EDICIÓN: tenga en cuenta que en el código, sería necesario

    _details.Sort();

    como el Sort método sólo está definido en List<T>, no IList<T>. Si necesita ordenar desde el exterior, donde no se tiene acceso a él como un List<T> (usted no debe lanzarla como la List<T> parte es un detalle de implementación) usted necesitará hacer un poco más de trabajo.

    Yo no saber de cualquier IList<T>basado en el lugar de las clases en .NET, el cual es un poco extraño ahora he llegado a pensar en ello. IList<T> proporciona todo lo que necesita, por lo que podría ser escrito como un método de extensión. Hay un montón de quicksort implementaciones en todo si quieres usar uno de esos.

    Si no le importa un poco de ineficiencia, siempre se puede 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, copia, ordenar, en su lugar, a continuación, copie la lista ordenada de vuelta.


    Puede utilizar LINQ para crear un nueva lista que contiene los valores originales pero ordenada:

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

    Depende de la conducta que usted desea. Tenga en cuenta que su shuffle método no es ideal:

    • La creación de un nuevo Random dentro del método se ejecuta en algunos de los problemas se muestra aquí
    • Puede declarar val dentro del bucle no está el uso de que valor predeterminado
    • Es más idiomático usar el Count de la propiedad cuando se saber usted está trabajando con una IList<T>
    • A mi mente, una for bucle es más fácil de entender que recorrer la lista hacia atrás con un while bucle

    Hay otras implementaciones de mezclarse con Fisher-Yates en Stack Overflow – buscar y encontrar uno con bastante rapidez.

    • Así que si yo quería para ordenar la lista se crea por encima de entonces sólo tengo que decir: sortedList.Ordenar ?
    • He probado la Especie, pero no puede conseguir que funcione.- Mi lista se parece a esto: IList<cadena> nD. Traté de encontrar.Sort() pero dice: no se Puede resolver el símbolo de ‘Ordenar’.
    • Uso _details.Sort() lugar – como _details está declarada como una List<string> en lugar de IList<string>. Sort es sólo declaró en List<T>, no IList<T>.
  2. 21

    Hay dos formas:

    Sin LINQ: yourList.Sort();

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

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

    • Mi lista se parece a esto: IList<cadena> nD. Traté de encontrar.Sort() pero dice: no se Puede resolver el símbolo de ‘Ordenar’.
    • es un miembro de List<T> no IList<T>. Usted podría considerar el cambio a la anterior (a menos que vaya a trabajar con diferentes IList<T> implementaciones.)
  3. 18

    Otra manera

    _details.Sort((s1, s2) => s1.CompareTo(s2)); 
    • Esta tiene la ventaja de adaptarse a ordenar cualquier objeto por una de sus propiedades.
  4. 11

    Usted debería ser capaz de utilizar OrderBy en LINQ…

    var sortedItems = myList.OrderBy(s => s);
    • Nota: que devuelve IEnumerable<T> y no en lugar de ordenar
  5. 1

    Lo que está mal con List<T>.Sort()?

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

    • Me gustaría usar este pero me da un error. Esto es lo que he añadido para el otro comentario. Espero que usted pueda ayudar a Mi lista se parece a esto: IList<cadena> nD. Traté de encontrar.Sort() pero dice: no se Puede resolver el símbolo de ‘Ordenar’.
    • utilice la interfaz IList<T> que no contiene el método de Ordenación. Ordenar la Lista de<T> variable directamente. En otras palabras, usted puede ordenar _details de su ejemplo, pero no Details

Dejar respuesta

Please enter your comment!
Please enter your name here