C#语言各个版本特性(二)

匿名 (未验证) 提交于 2019-12-02 22:10:10

二、排序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 }
View Code

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 }
View Code

提供一个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 }
View Code

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 }
View Code

使用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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

总结:

→C#1,弱类型的比较功能不支持委托排序。

→C#2,强类型的比较功能,委托比较,匿名方法。

→C#3Lambda表达式,扩展方法,允许列表保持未排序状态。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!