Ordenar una lista de clase personalizada

Me gustaría ordenar mi lista con la propiedad de date .

Esta es mi clase personalizada:

 using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace Test.Web { public class cTag { public int id { get; set; } public int regnumber { get; set; } public string date { get; set; } } } 

Y esta es la List que quiero ordenar:

 List Week = new List(); 

Lo que quiero hacer es ordenar la lista por la propiedad de date de la clase cTag. La fecha está en el formato: dd.MM.aaaa.

Leí algo sobre la interfaz de IComparable , pero no sé cómo usarlo.

Una forma de hacerlo es con un delegate

 List week = new List(); // add some stuff to the list // now sort week.Sort(delegate(cTag c1, cTag c2) { return c1.date.CompareTo(c2.date); }); 

Tiene razón en que su clase cTag debe implementar la interfaz IComparable . Luego puede simplemente llamar a Sort() en su lista.

Para implementar la interfaz IComparable , debe implementar el CompareTo(T other) . La forma más fácil de hacerlo es llamar al método CompareTo del campo que desea comparar, que en su caso es la fecha.

 public class cTag:IComparable { public int id { get; set; } public int regnumber { get; set; } public string date { get; set; } public int CompareTo(cTag other) { return date.CompareTo(other.date); } } 

Sin embargo, esto no funcionaría bien, porque usaría clasificación clásica en cadenas (ya que declaró la fecha como cadena). Así que creo que lo mejor que se puede hacer sería redefinir la clase y declarar la fecha no como una cadena, sino como DateTime. El código se mantendría casi igual:

 public class cTag:IComparable { public int id { get; set; } public int regnumber { get; set; } public DateTime date { get; set; } public int CompareTo(cTag other) { return date.CompareTo(other.date); } } 

Lo único que tendría que hacer al crear la instancia de la clase para convertir su cadena que contiene la fecha en el tipo DateTime, pero se puede hacer fácilmente, por ejemplo, mediante el método DateTime.Parse(String) .

Para este caso, también puedes ordenar usando LINQ:

 week = week.OrderBy(w => DateTime.Parse(w.date)).ToList(); 
 List week = new List(); week.Sort((x, y) => DateTime.ParseExact(x.date, "dd.MM.yyyy", CultureInfo.InvariantCulture).CompareTo( DateTime.ParseExact(y.date, "dd.MM.yyyy", CultureInfo.InvariantCulture)) ); 

Lo primero es lo primero, si la propiedad date almacena una fecha, guárdela usando DateTime. Si analiza la fecha a través del género que tiene que analizar por cada artículo que se compara, eso no es muy eficiente …

A continuación, puede hacer un IComparer:

 public class TagComparer : IComparer { public int Compare(cTag first, cTag second) { if (first != null && second != null) { // We can compare both properties. return first.date.CompareTo(second.date); } if (first == null && second == null) { // We can't compare any properties, so they are essentially equal. return 0; } if (first != null) { // Only the first instance is not null, so prefer that. return -1; } // Only the second instance is not null, so prefer that. return 1; } } var list = new List(); // populate list. list.Sort(new TagComparer()); 

Incluso puedes hacerlo como delegado:

 list.Sort((first, second) => { if (first != null && second != null) return first.date.CompareTo(second.date); if (first == null && second == null) return 0; if (first != null) return -1; return 1; }); 

Tienes razón, necesitas implementar IComparable. Para hacer esto, simplemente declare su clase:

 public MyClass : IComparable { int IComparable.CompareTo(object obj) { } } 

En CompareTo, simplemente implementa su algoritmo de comparación personalizado (puede usar objetos DateTime para hacer esto, pero asegúrese de verificar el tipo de “obj” primero). Para más información, mira aquí y aquí .

Puedes usar linq:

 var q = from tag in Week orderby Convert.ToDateTime(tag.date) select tag; List Sorted = q.ToList() 

mira el método Sort sobrecargado de la clase List. hay algunas formas de hacerlo. uno de ellos: su clase personalizada tiene que implementar la interfaz IComparable y luego usar el método Sort de la clase List.

Gracias por todas las rápidas respuestas.

Esta es mi solución:

 Week.Sort(delegate(cTag c1, cTag c2) { return DateTime.Parse(c1.date).CompareTo(DateTime.Parse(c2.date)); }); 

Gracias

YourVariable.Sort ((a, b) => a.amount.CompareTo (b.amount));