2010-06-24 13 views

Respuesta

12

Bajo C# 3.0 se puede utilizar la siguiente declaración de LINQ:

var sortedEnumerable = myPeople.OrderBy(p => p.LastName); 
+0

Corto y dulce, gracias! –

1

Una costumbre IComparer<person>. Si está utilizando C# 3.0 y .net3.5, eche un vistazo a los métodos LINQ, especialmente IEnumerable<T>.OrderBy().

2

Una opción es escribir un comparador:

class LastNameComparer : IComparer<Person> 
{ 
    public int Compare(Person x, Person y) 
    { 
     return String.Compare(x.LastName, y.LastName); 
    } 
} 

Una continuación

myPeople.Sort(new LastNameComparer()); 

Person También puede aplicar IComparable<Person>, en cuyo caso será suficiente myPeople.Sort(). Sin embargo, es posible que desee ordenar por otras propiedades en otros lugares, por lo que este no es un método general; si desea ordenar por ID en otro informe, puede escribir otro IComparer, pero solo puede tener un método IComparable<Person>.CompareTo(Person other).

Si estás perezoso, o asegurarse de que no va a usar de nuevo, también se puede utilizar un lambda:

myPeople.Sort((p1, p2) => String.Compare(p1.LastName, p2.LastName)); 
+0

¡Buena respuesta! :) –

3

Como otros han sugerido, puede utilizar una costumbre IComparer método para ordenar su lista. Si sólo lo haces una vez, la forma más fácil es usar un método anónimo, como por ejemplo:

List<Person> myPeople = GetMyPeople(); 
myPeople.Sort(delegate(Person one, Person two) 
{ 
    return one.LastName.CompareTo(two.LastName); 
}); 

Alternativamente, se puede implementar IComparable en su clase de la persona, por lo que la clase sabe cómo ordenar en sí:

class Person : IComparable<Person> 
{ 
    int id; 
    string FirstName; 
    string LastName; 

    public int CompareTo(Person other) 
    { 
     return LastName.CompareTo(other.LastName); 
    } 
} 
14

List<T>.Sort ordenará la lista en el lugar. Si eso es lo que quiere, dulce: utilizar the overload that takes a Comparison<T> delegate:

List<Person> myPeople = GetMyPeople(); 
myPeople.Sort((x, y) => x.LastName.CompareTo(y.LastName)); 

Si no desea modificar la lista real pero desea enumerar más de su contenido en una forma ordenada, entonces, como han sugerido otros, utilizar the LINQ extension method OrderBy (.NET 3.5 y superior) en su lugar. Este método puede tomar un selector simple de Func<T, TKey> y ordenarlo con las teclas que este selector ... ya sabes, selecciona.

List<Person> myPeople = GetMyPeople(); 
var orderedByLastName = myPeople.OrderBy(p => p.LastName); 
+0

La mejor respuesta hasta ahora. Es molesto crear un IComparer para cada Propiedad que quieras ordenar. –

+0

También hay un método OrderByDescending en LINQ si ese es el orden que necesita. – brainimus

+0

+1, obtiene el primer premio finalista. –

0

Nada tiene que ir dentro de su "Ordenar" llamada al método si su clase implementa IComparable.

Compruebe esto link para más detalles.

Código:

class person : IComparable<person> 
{ 
    int id; 
    string FirstName; 
    string LastName; 

public int CompareTo(person other) 
    { 
     //If you want to sort on FirstName 
     return FirstName.CompareTo(other.FirstName); 
    } 


} 
1

ejemplo de COMPARAR

/// <summary> 
    /// Sort class on LastName Descending Order 
    /// </summary> 
    private class PersonLastNameDescending : IComparer<Person> 
    { 
     public int Compare(Person aX, Person aY) 
     { 
     return aY.LastName.CompareTo(aX.LastName); 
     } // end Compare(...) 
    } // end inner class PersonLastNameDescending 

    MyPeople.Sort(new PersonLastNameDescending()); 
Cuestiones relacionadas