首页 > Python基础教程 >
-
C#教程之C#语言各个版本特性
二、排序Product
1.按名称对产品进行排序,以特定顺序显示一个列表的最简单方式就是先将列表排序,再遍历并显示其中的项。
C#1.1 使用IComparer对ArrayList进行排序
product类
1 using System.Collections; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp1 5 { 6 [Description("Listing 1.01")] 7 public class Product 8 { 9 string name; 10 public string Name 11 { 12 get { return name; } 13 } 14 15 decimal price; 16 public decimal Price 17 { 18 get { return price; } 19 } 20 21 public Product(string name, decimal price) 22 { 23 this.name = name; 24 this.price = price; 25 } 26 27 public static ArrayList GetSampleProducts() 28 { 29 ArrayList list = new ArrayList(); 30 list.Add(new Product("West Side Story", 9.99m)); 31 list.Add(new Product("Assassins", 14.99m)); 32 list.Add(new Product("Frogs", 13.99m)); 33 list.Add(new Product("Sweeney Todd", 10.99m)); 34 return list; 35 } 36 37 public override string ToString() 38 { 39 return string.Format("{0}: {1}", name, price); 40 } 41 } 42 }
ArrayListSort类
1 using System; 2 using System.Collections; 3 using System.ComponentModel; 4 5 namespace Chapter01.CSharp1 6 { 7 [Description("Listing 1.05")] 8 class ArrayListSort 9 { 10 class ProductNameComparer : IComparer 11 { 12 public int Compare(object x, object y) 13 { 14 Product first = (Product)x; 15 Product second = (Product)y; 16 return first.Name.CompareTo(second.Name); 17 } 18 } 19 20 static void Main() 21 { 22 ArrayList products = Product.GetSampleProducts(); 23 products.Sort(new ProductNameComparer()); 24 foreach (Product product in products) 25 { 26 Console.WriteLine(product); 27 } 28 } 29 } 30 }
提供一个IComparer实现,比较器。或者Product类实现IComparable。
区别:IComparer和IComparable(比较器接口和可比较的接口)
缺陷:Compare方法中显示强制类型转换,而ArrayList是类型不安全的,转换为对象Product时可能报错。foreach循环中隐式的编译器自动类型转换,转换为Product类型执行时可能报错。
2.C#2.0 引入泛型,使用IComparer<Product>对List<Product>进行排序
product类
1 using System.Collections.Generic; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp2 5 { 6 [Description("Listing 1.02")] 7 public class Product 8 { 9 string name; 10 public string Name 11 { 12 get { return name; } 13 private set { name = value; } 14 } 15 16 decimal price; 17 public decimal Price 18 { 19 get { return price; } 20 private set { price = value; } 21 } 22 23 public Product(string name, decimal price) 24 { 25 Name = name; 26 Price = price; 27 } 28 29 public static List<Product> GetSampleProducts() 30 { 31 List<Product> list = new List<Product>(); 32 list.Add(new Product("West Side Story", 9.99m)); 33 list.Add(new Product("Assassins", 14.99m)); 34 list.Add(new Product("Frogs", 13.99m)); 35 list.Add(new Product("Sweeney Todd", 10.99m)); 36 return list; 37 } 38 39 public override string ToString() 40 { 41 return string.Format("{0}: {1}", name, price); 42 } 43 } 44 }
ListSortWithComparer类
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 5 namespace Chapter01.CSharp2 6 { 7 [Description("Listing 1.06")] 8 class ListSortWithComparer 9 { 10 class ProductNameComparer : IComparer<Product> 11 { 12 public int Compare(Product first, Product second) 13 { 14 return first.Name.CompareTo(second.Name); 15 } 16 } 17 18 static void Main() 19 { 20 List<Product> products = Product.GetSampleProducts(); 21 products.Sort(new ProductNameComparer()); 22 foreach (Product product in products) 23 { 24 Console.WriteLine(product); 25 } 26 } 27 } 28 }
使用Comparison<Product>对List<Product>进行排序(C#2),不需要实现ProductNameComparer比较器类型,只是创建一个委托实例(C#2.0 匿名方法)。
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 5 namespace Chapter01.CSharp2 6 { 7 [Description("Listing 1.07")] 8 class ListSortWithComparisonDelegate 9 { 10 static void Main() 11 { 12 List<Product> products = Product.GetSampleProducts(); 13 products.Sort(delegate(Product first, Product second) 14 { return first.Name.CompareTo(second.Name); } 15 ); 16 foreach (Product product in products) 17 { 18 Console.WriteLine(product); 19 } 20 } 21 } 22 }
3.C#3.0 Lambda表达式 在Lambda表达式中使用Comparison<Product>进行排序(C#3)
product类
1 using System.Collections.Generic; 2 using System.ComponentModel; 3 4 namespace Chapter01.CSharp3 5 { 6 [Description("Listing 1.3")] 7 class Product 8 { 9 public string Name { get; private set; } 10 public decimal Price { get; private set; } 11 12 public Product(string name, decimal price) 13 { 14 Name = name; 15 Price = price; 16 } 17 18 Product() 19 { 20 } 21 22 public static List<Product> GetSampleProducts() 23 { 24 return new List<Product> 25 { 26 new Product { Name="West Side Story", Price = 9.99m }, 27 new Product { Name="Assassins", Price=14.99m }, 28 new Product { Name="Frogs", Price=13.99m }, 29 new Product { Name="Sweeney Todd", Price=10.99m} 30 }; 31 } 32 33 public override string ToString() 34 { 35 return string.Format("{0}: {1}", Name, Price); 36 } 37 } 38 }
ListSortWithLambdaExpression类
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 5 namespace Chapter01.CSharp3 6 { 7 [Description("Listing 1.08")] 8 class ListSortWithLambdaExpression 9 { 10 static void Main() 11 { 12 List<Product> products = Product.GetSampleProducts(); 13 products.Sort( 14 (first, second) => first.Name.CompareTo(second.Name) 15 ); 16 foreach (Product product in products) 17 { 18 Console.WriteLine(product); 19 } 20 } 21 } 22 }
ListOrderWithExtensionMethod类 使用扩展方法对List<Product>进行排序
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Linq; 5 6 namespace Chapter01.CSharp3 7 { 8 [Description("Listing 1.09")] 9 class ListOrderWithExtensionMethod 10 { 11 static void Main() 12 { 13 List<Product> products = Product.GetSampleProducts(); 14 15 foreach (Product product in products.OrderBy(p => p.Name)) 16 { 17 Console.WriteLine(product); 18 } 19 } 20 } 21 }
总结:
→C#1,弱类型的比较功能不支持委托排序。
→C#2,强类型的比较功能,委托比较,匿名方法。
→C#3Lambda表达式,扩展方法,允许列表保持未排序状态。