首先,是一个产品类,代码如下
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
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); }
这样就完成了排序,至于到底用哪一种方法,就看哪一种顺手就用哪种.