通用列表排序

10

我想对一个泛型列表按日期升序进行排序。(框架v2)

有什么建议吗?


抱歉,该列表是一个具有 DateTime 类型属性的类。 - chrr
3个回答

6

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

祝你好运。


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呢? - stevehipwell
如果我这样做,我将始终只有一种排序方法。当我使用大量的“if”来修改我想要排序的方式时,我可能会遇到严重的问题(涉及可读性问题)。请注意,在具有此唯一目的的类中实现IComparer不过是使用了策略设计模式(GoF)。 - user256680

3
使用List<T>.Sort(),只需确保您有一个合适的比较器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接