2009-03-03 11 views
15

Mi código es el siguiente:¿Cómo puedo ordenar la lista <T> según las propiedades de T?

Collection<NameValueCollection> optionInfoCollection = .... 
List<NameValueCollection> optionInfoList = new List<NameValueCollection>(); 
optionInfoList = optionInfoCollection.ToList(); 

if(_isAlphabeticalSoting) 
    Sort optionInfoList 

me trataron optionInfoList.Sort() pero no está funcionando.

Respuesta

27

Usando el método de ordenación y lambda expresiones, es muy fácil.

myList.Sort((a, b) => String.Compare(a.Name, b.Name)) 

El ejemplo anterior muestra cómo ordenar por la propiedad Nombre de tu tipo de objeto, suponiendo que el nombre es de tipo cadena.

+4

Qué va a hacer estallar si es a.Name null ... –

+0

Podrías usar string.Compare (a.Name, b.Name), ¿cuál sería seguro? –

+0

¡Gracias! Aprende algo nuevo todos los días ... Editaré la respuesta. –

8

Si solo desea que Sort() funcione, deberá implementar IComparable o IComparable<T> en la clase.

Si no te importa la creación de una nueva lista , puede utilizar los OrderBy/ToList métodos de extensión LINQ. Si desea ordenar la lista existente con la sintaxis más simple, puede agregar algunos métodos de extensión, lo que permite:

list.Sort(item => item.Name); 

Por ejemplo:

public static void Sort<TSource, TValue>(
    this List<TSource> source, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    source.Sort((x, y) => comparer.Compare(selector(x), selector(y))); 
} 
public static void SortDescending<TSource, TValue>(
    this List<TSource> source, 
    Func<TSource, TValue> selector) 
{ 
    var comparer = Comparer<TValue>.Default; 
    source.Sort((x, y) => comparer.Compare(selector(y), selector(x))); 
} 
+0

¿Tiene un ejemplo del uso de estos métodos de extensión, traté de usar para mi pregunta http://stackoverflow.com/questions/31057258/sort-list-of-dictionary-using-icomparer-instead-of-orderby, pero couldn No implemente la forma que ha sugerido –

2
public class Person { 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

List<Person> people = new List<Person>(); 

people.Sort(
    delegate(Person x, Person y) { 
     if (x == null) { 
      if (y == null) { return 0; } 
      return -1; 
     } 
     if (y == null) { return 0; } 
     return x.FirstName.CompareTo(y.FirstName); 
    } 
); 
Cuestiones relacionadas