【问题标题】:Sort Generic List排序通用列表
【发布时间】:2020-12-27 21:08:53
【问题描述】:

我想按日期升序对通用列表进行排序。 (框架 v2)

有什么建议吗?

【问题讨论】:

  • 抱歉,列表属于具有 DateTime 类型属性的类

标签: c# .net generics


【解决方案1】:

Upul 和 Wim 说明了一切:
使用委托:

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】:

    使用List&lt;T&gt;.Sort(),并确保您有合适的比较器。

    【讨论】:

      【解决方案3】:

      对于这种情况,我会建议一些非常相似的方法,但我认为这是解决此问题的更好方法。

      我会实现新的类,它们唯一的作用就是拥有特定的排序“策略”。例如;我会创建“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());
          }
      

      我们应该得到的是:

      PRODUCTS SORTED BY PRICE
      Product P ($5,14)
      Product D ($12,80)
      Product A ($25,19)
      Product Z ($45,98)
      Product B ($65,00)
      

      PRODUCTS SORTED BY NAME
      Product A ($25,19)
      Product B ($65,00)
      Product D ($12,80)
      Product P ($5,14)
      Product Z ($45,98)
      

      我认为这会有所帮助。

      【讨论】:

      • 为什么不在产品上实现 IComparable?
      • 如果我这样做,我将永远被束缚在只有一种排序方法上。当使用大量“如果”来修改我想要排序的方式时,我可能会遇到一个严重的问题(涉及可重复性问题)。请注意,在仅具有此功能的类中实现 IComparer 只不过是使用的策略设计模式 (GoF)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多