¿Cómo ordenar una lista de objetos por un campo específico en C #?

Tengo esta clase:

public class StatInfo { public string contact; public DateTime date; public string action; } 

entonces tengo una lista de StatInfo, pero no estoy seguro de cómo ordenarlo según el campo de fecha. ¿Debo usar el método de clasificación? ¿Debería crear el mío?

 var _allStatInfo = new List(); // adding lots of stuff in it _allStatInfo.SortByDate??? 

¿Cuál es la mejor manera de hacerlo sin tener que escribir toneladas de código (si es posible)?

Gracias

Usando LINQ:

 var sortedList = _allStatInfo.OrderBy(si => si.date).ToList(); 

Ordenando la lista original:

 _allStatInfo.Sort(new Comparison((x, y) => DateTime.Compare(x.date, y.date))); 

Veo que tienes la respuesta de todos modos, pero …

  1. Puedes evitar algo de fealdad simplemente dividiendo la statement en dos mitades:

     Comparison comparison = (x, y) => DateTime.Compare(x.date, y.date); _allStatInfo.Sort(comparison); 

    También CompareTo considerar simplemente llamar a CompareTo directamente:

     Comparison comparison = (x, y) => x.date.CompareTo(y.date); _allStatInfo.Sort(comparison); 
  2. Podrías crear una IComparer usando mi clase ProjectionComparer , es parte de MiscUtil , y he incluido una versión no comentada al final de esta respuesta. Entonces escribirías:

     _allStatInfo.Sort(ProjectionComparer.Create(x => x.date)); 
  3. Incluso si usa .NET 2.0, aún puede usar LINQ por medio de LINQBridge .

Aquí está la clase ProjectionComparer requerida para la segunda respuesta. Las primeras dos clases son realmente solo ayudantes para que la inferencia de tipo genérico funcione mejor.

 public static class ProjectionComparer { public static ProjectionComparer Create (Func projection) { return new ProjectionComparer(projection); } public static ProjectionComparer Create (TSource ignored, Func projection) { return new ProjectionComparer(projection); } } public static class ProjectionComparer { public static ProjectionComparer Create (Func projection) { return new ProjectionComparer(projection); } } public class ProjectionComparer : IComparer { readonly Func projection; readonly IComparer comparer; public ProjectionComparer(Func projection) : this (projection, null) { } public ProjectionComparer(Func projection, IComparer comparer) { projection.ThrowIfNull("projection"); this.comparer = comparer ?? Comparer.Default; this.projection = projection; } public int Compare(TSource x, TSource y) { // Don't want to project from nullity if (x==null && y==null) { return 0; } if (x==null) { return -1; } if (y==null) { return 1; } return comparer.Compare(projection(x), projection(y)); } } 

Para ilustrar la respuesta de Robert C. Cartaino:

 public class StatInfo : IComparable { public string contact; public DateTime date; public string action; public int CompareTo(StatInfo value) { return this.date.CompareTo(value.date); } } var _allStatInfo = new List(); // this now sorts by date _allStatInfo.Sort(); 

No es la solución más general, pero es buena si solo vas a ordenar por fecha. Y, como dijo Robert, aún puede anular siempre la clasificación predeterminada pasando un parámetro IComparer al método de clasificación.

Use una expresión lambda para asignar un par a una comparación:

 _allStatInfo.Sort((x, y) => x.date - y.date); 

Para DateTime no debería haber necesidad de comparar.

 _allStatInfo.OrderyBy(d => d.date); 

o

 _allStatInfo.OrderByDescending(d => d.Date); 

funcionó para mí Clasificar matriz de tipo personalizado usando delegado

 // sort array by name Array.Sort(users, delegate(User user1, User user2) { return user1.Name.CompareTo(user2.Name); }); // write array (output: Betty23 Lisa25 Susan20) foreach (User user in users) Console.Write(user.Name + user.Age + " ");