2010-01-22 16 views
9

Quiero ordenar una lista genérica en orden de fecha ascendente. (v2 marco)Ordenar lista genérica

¿Alguna sugerencia?

Gracias

+0

¿Qué hay en la lista? – spender

+0

Lo siento, la lista es de una clase con una propiedad de tipo fecha y hora – chrr

Respuesta

14

This is a nice tutorial que le muestra cómo hacerlo.

+2

Iba a responder lo mismo, simplemente genial, ¿no? –

+1

El sitio está caído ... – Jeff

2

Use List<T>.Sort(), y sólo asegúrese de que tiene un comparador apropiado.

3

Upul y Wim lo decían todo:
Use delegados:

new List<DateTime>().Sort(delegate(DateTime d1, DateTime d2) { 
    return d1.CompareTo(d2); 
}); 

O si tiene una clase o algo que sostiene que la fecha y hora:

new List<Nhonho>().Sort(delegate(Nhonho n1, Nhonho n2) { 
    return n1.date.CompareTo(n2.date); 
}); 

Para que sea disminuyendo,

new List<Nhonho>().Sort(delegate(Nhonho n1, Nhonho n2) { 
    return n2.date.CompareTo(n1.date); 
}); 

Buena suerte.

2

Hola chicos! Para este escenario, sugeriría algo bastante similar, pero en mi opinión una mejor manera de resolver este problema.

Me implementar nuevas clases que su única pourpouse es tener una "estrategia" en particular de clasificación. Por ejemplo; Crearía "ProductNameComparer" y "ProductPriceComparer", estas clases deberían implementar la interfaz IComparer, entonces solo llamaría al método para pasar estas estrategias como parámetros. Puede verificar el código que acabo de hacer para ilustrar mi ponit;

public class ProductPriceComparer : IComparer<Product> 
    { 
     public int Compare(Product x, Product y) 
     { 
      if (x.Price > y.Price) 
       return 1; 

      if (x.Price < y.Price) 
       return -1; 

      return 0; 
     } 
    } 

    public class ProductNameComparer : IComparer<Product> 
    { 
     public int Compare(Product x, Product y) 
     { 
      return x.Name.CompareTo(y.Name); 
     } 
    } 

    public class Product 
    { 
     public Product(String name, Decimal price) 
     { 
      this.name = name; 
      this.price = price; 
     } 

     private String name; 
     public String Name 
     { 
      get { return name; } 
      set { name = value; } 
     } 

     private Decimal price; 
     public Decimal Price 
     { 
      get { return price; } 
      set { price = value; } 
     } 

     public override string ToString() 
     { 
      return Name + " ($"+ Price.ToString() + ")"; 
     } 
    } 

    static void Main(string[] args) 
    { 
     List<Product> products = new List<Product>(); 
     products.Add(new Product("Product Z", 45.98m)); 
     products.Add(new Product("Product D", 12.80m)); 
     products.Add(new Product("Product A", 25.19m)); 
     products.Add(new Product("Product B", 65.00m)); 
     products.Add(new Product("Product P", 5.14m)); 

     Console.WriteLine("PRODUCTS SORTED BY PRICE"); 
     products.Sort(new ProductPriceComparer()); 
     foreach (Product p in products) 
      Console.WriteLine(p.ToString()); 

     Console.WriteLine("\n--------------------------------\n"); 

     Console.WriteLine("PRODUCTS SORTED BY NAME"); 
     products.Sort(new ProductNameComparer()); 
     foreach (Product p in products) 
      Console.WriteLine(p.ToString()); 
    } 

Lo que se supone que tenemos es;

los productos ordenados por precio producto P ($ 5,14) producto D ($ 12,80) producto A ($ 25,19) producto Z ($ 45,98) Producto B ($ 65,00)


los productos ordenados por NOMBRE producto A ($ 25,19) Producto B ($ 65,00) producto D ($ 12,80) producto P ($ 5,14) producto Z ($ 45,98)

¡Creo que va a ayudar! ¡Nos vemos!

+0

¿Por qué no simplemente implementar IComparable en el producto? – stevehipwell

+0

Si lo hago, siempre estaré atada por tener solo un método de clasificación. Y puedo tener un problema grave cuando uso muchos "si" para modificar la forma en que quiero clasificar (implicar en problemas de redacción). Tenga en cuenta que la implementación de IComparer en las clases que tiene este único pourporse no es más que el Patrón de Diseño de Estrategia (GoF) que se utiliza. – user256680

+0

¿Cómo se clasifica por fecha? –