2010-01-22 10 views
9

Je souhaite trier une liste générique en ordre croissant. (Framework v2)Trier la liste générique

Des suggestions?

Merci

+0

Qu'est-ce qui est dans la liste? – spender

+0

Désolé, la liste est d'une classe avec une propriété de type DateTime – chrr

Répondre

14

This is a nice tutorial il vous montre comment le faire.

+2

J'allais répondre à la même chose, juste super les délégués, n'est-ce pas? –

+1

Le site est en panne ... – Jeff

2

Utilisez List<T>.Sort(), et assurez-vous juste que vous avez un comparateur approprié.

3

Upul et Wim tout dit:
Utilisez les délégués:

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

Ou si vous avez une classe ou quelque chose qui veut que datetime:

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

Pour le rendre diminuer,

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

Bonne chance.

2

Salut les gars! Pour ce scénario, je suggère quelque chose de très similaire mais à mon avis, une meilleure façon de résoudre ce problème. Je voudrais implémenter de nouvelles classes que leur seul pourpouse est d'avoir une "stratégie" de tri particulière. Par exemple; Je créerais "ProductNameComparer" et "ProductPriceComparer", ces classes devraient implémenter l'interface d'IComparer, alors j'appellerais seulement le tri de méthode passant ces stratégies en tant que paramètres. Vous pouvez vérifier le code que je viens de faire pour illustrer mon 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()); 
    } 

Ce que nous sommes supposés obtenir est;

produits classés par PRIX produit P (5,14 $) Produit D (12,80 $) le produit (25,19 $) Produit Z (45,98 $) Produit B (65,00 $)


produits par NOM Un produit (25,19 $) produit B (65,00 $) produit D (12,80 $) produit P (5,14 $) produit Z (45,98 $)

Je pense que ça va aider !!! Voir yaa!

+0

Pourquoi ne pas implémenter IComparable sur le produit? – stevehipwell

+0

Si je le fais, je serai toujours lié à avoir une seule méthode de tri. Et je peux avoir un problème sérieux en utilisant beaucoup de "si" pour modifier la façon dont je veux trier (impliquer dans les problèmes de redibilisation). Notez qu'implanter IComparer dans les classes qui ont cette seule pourporse n'est rien de plus que le Strategy Design Pattern (GoF) utilisé. – user256680

+0

Comment est ce tri par date? –