2010-01-22 41 views
9

我想按升序排列日期順序的通用列表。 (Framework v2)排序通用列表

有什麼建議嗎?

感謝

+0

什麼是在列表中? – spender 2010-01-22 11:08:04

+0

對不起,該列表屬於帶DateTime類型屬性的類 – chrr 2010-01-22 11:13:28

回答

14

This is a nice tutorial它告訴你如何去做。

+2

我打算回答同樣的問題,這些代表很棒,不是嗎? – 2010-01-22 11:23:17

+1

該網站已關閉... – Jeff 2017-10-10 14:49:56

2

使用List<T>.Sort(),只是確保你有適當的比較器。

3

Upul和維姆說,這一切:
使用委託:

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

或者,如果你有認爲,日期時間類或某事:

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

爲了讓減輕,

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

祝你好運。

2

嘿傢伙!對於這種情況,我會建議一些非常相似的東西,但在我看來,這是解決這個問題的更好方法。

我會實現新的類,他們唯一的傾盆大雨是有一個特定的排序「戰略」。例如;我會創建「ProductNameComparer」和「ProductPriceComparer」,這些類應該實現IComparer接口,然後我只會調用傳遞這些策略的方法sort作爲參數。你可以檢查我剛剛做出的代碼以證實我的想法;

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()); 
    } 

我們被要求得到的是;

產品一般篩選PRICE 產品P(5,14 $) 產品d($ 12,80) 產品A($ 25,19) 產品Z($ 45,98) 產品B($ 65.00)


產品排序方式名稱 產品A(25,19 $) 產品B($ 65.00) 產品d($ 12,80) 產品P($ 5,14) 產品Z($ 45,98)

我認爲它會幫助!再見!

+0

爲什麼不直接在產品上實現IComparable? – stevehipwell 2010-01-22 13:08:26

+0

如果我這樣做,我會一直只有一種排序方法。當我使用大量「if」來修改我想要排序的方式時(可能導致可重定性問題),我可能會遇到嚴重問題。請注意,在僅具有這種傾向的類中實現IComparer只不過是使用了策略設計模式(GoF)。 – user256680 2010-01-22 13:26:00

+0

按日期排序如何? – 2011-11-25 01:11:15