c#使用泛型集合来实现自定义的排序

首先,是一个产品类,代码如下

public class Product
    {
        readonly string name;
        public string Name { get { return name; } }
        readonly decimal price;
        public decimal Price { get { return price; } }

        public Product(string name, decimal price)
        {
            this.name = name;
            this.price = price;
        }
        public static List<Product> GetSampleProduct()
        {
            return new List<Product>
            {
                new Product(name:"name1",price:1.1m),
                new Product(name:"name4",price:6.1m),
                new Product(name:"name3",price:67.1m),
                new Product(name:"name2",price:3.1m)
            };
        }
        public override string ToString()
        {
            return string.Format("{0} : {1}", name, price);
        }

    }

第一种方法是继承IComparable,然后实现Compare方法.代码如下

class ProductNameComparer : IComparer<Product>
    {
        
        public int Compare(Product x, Product y)
        {
            return x.Name.CompareTo(y.Name);
        }
    }
//然后就可以通过list.sort来排序,如下:
List<Product> products = Product.GetSampleProduct();
products.Sort(new ProductNameComparer());

如果通过上面的方法来实现的话我们就必须实现一个ProductNameComparer类,这样有点麻烦.在看看sort.sort方法的一个重载是Comparison类型的参数,那么Comparison到底是什么东东呢?


namespace System
{
    // 摘要:
    //     表示比较同一类型的两个对象的方法。
    //
    // 参数:
    //   x:
    //     要比较的第一个对象。
    //
    //   y:
    //     要比较的第二个对象。
    //
    // 类型参数:
    //   T:
    //     要比较的对象的类型。
    //
    // 返回结果:
    //     一个有符号整数,指示 x 与 y 的相对值,如下表所示。 值 含义 小于 0 x 小于 y。 0 x 等于 y。 大于 0 x 大于 y。
    public delegate int Comparison<in T>(T x, T y);
}

看到了吧,其实就是委托,所以我们可以这样做

List<Product> products = Product.GetSampleProduct();
            products.Sort(delegate(Product x, Product y)
            {
                return x.Name.CompareTo(y.Name);
            });

在这里,我们创建了一个委托实例,这个委托实例来告诉sort方法进行比较.那么,既然是委托,嘿嘿,咱们就可以这样做

//使用Lambda表达式
products.Sort((x, y) => x.Name.CompareTo(y.Name));
//或者这样
//order by是一个扩展方法,所以这里我们不再是"原地"对List排序,而是按照指定的顺序来获取列表内容.
 foreach (Product p in products.OrderBy(p=>p.Name))
            {
                Console.WriteLine(p);
            }
//使用Linq
var ps=from p in products
                   orderby p.Price descending
                   select p;
            foreach (Product p in ps)
            {
                Console.WriteLine(p);
            }

这样就完成了排序,至于到底用哪一种方法,就看哪一种顺手就用哪种.

发表评论

电子邮件地址不会被公开。 必填项已用*标注