威尼斯人线上娱乐

数据类型,深刻明白C

11 4月 , 2019  

二、排序Product

引言

在开班看那本书以前看过1些技巧博客,填补自个儿对此部分知识点的供不应求。无意中发现了《深切精通C#》那本书,本书首要探究C#
2、C# 3和C# 肆的底细与特征,所以做了眨眼之间间读书笔记,欢迎拍砖。

引言

在初始看那本书此前看过一些技巧博客,填补本人对此部分知识点的欠缺。无意中发现了《深远通晓C#》那本书,本书主要探究C#
2、C# 3和C# 四的底细与个性,所以做了眨眼之间间读书笔记,欢迎拍砖。

壹、数据类型的前行

一.按名称对产品实行排序,以一定顺序显示二个列表的最简便易行方法正是先将列表排序,再遍历并体现中间的项。

目录

  • 从不难的数据类型起首
    • C# 一 中定义的出品连串
    • C# 二 中的强类型集合
    • C# 三 中机动达成的特性
    • 威尼斯人线上娱乐,C# 四 中的命名实参
  • 排序和过滤
    • 按名称对产品进行排序
    • 查询集合

目录

  • 从不难的数据类型早先
    • C# 第11中学定义的产品体系
    • C# 第22中学的强类型集合
    • C# 3中自动完结的天性
    • C# 4中的命名实参
  • 排序和过滤
    • 按名称对成品举行排序
    • 询问集合

数据类型,深刻明白C。 C#第11中学落到实处Product类型代码

C#一.一 使用IComparer对ArrayList实行排序

C#第11中学定义的出品体系

 1  public class Product 2     { 3         string name; 4         public string Name 5         { 6             get { return name; } 7         } 8         decimal price; 9         public decimal Price10         {11             get { return price; }12         }13         public Product(string name, decimal price)14         {15             this.name = name;16             this.price = price;17         }18         public static ArrayList GetSampleProducts()19         {20             ArrayList list = new ArrayList();21             list.Add(new Product("硬装芙蓉王", 25m));22             list.Add(new Product("精白沙", 9m));23             list.Add(new Product("软白沙", 5.5m));
25             return list;26         }27         public override string ToString()28         {29             return string.Format("{0}:{1}", name, price);30         }31     }

C#1 中定义的制品门类

 1  public class Product
 2     {
 3         string name;
 4         public string Name
 5         {
 6             get { return name; }
 7         }
 8         decimal price;
 9         public decimal Price
10         {
11             get { return price; }
12         }
13         public Product(string name, decimal price)
14         {
15             this.name = name;
16             this.price = price;
17         }
18         public static ArrayList GetSampleProducts()
19         {
20             ArrayList list = new ArrayList();
21             list.Add(new Product("硬装芙蓉王", 25m));
22             list.Add(new Product("精白沙", 9m));
23             list.Add(new Product("软白沙", 5.5m));
25             return list;
26         }
27         public override string ToString()
28         {
29             return string.Format("{0}:{1}", name, price);
30         }
31     }

威尼斯人线上娱乐 1威尼斯人线上娱乐 2

product类

缺点:

  1. ArrayList未有提供内部有关编写翻译时的音讯。大家很有十分大希望在GetSampleProducts方法中添加三个字符串到ArrayList中,因为ArrayList的Add方法中的参数是object,而编辑器并未任何反馈。
  2. 代码中提供了质量的取值方法,如若加上对应的赋值方法,那么赋值方法也必须是集体的艺术。
  3. 创办属性的代码过于复杂。

缺点:

  1. ArrayList未有提供内部有关编写翻译时的音讯。大家很有极大希望在GetSampleProducts方法中添加2个字符串到ArrayList中,因为ArrayList的Add方法中的参数是object,而编辑器并从未其它反馈。
  2. 代码中提供了品质的取值方法,借使加上对应的赋值方法,那么赋值方法也非得是共用的办法。
  3. 始建属性的代码过于复杂。
 1 public class Product
 2     {
 3         string name;
 4         public string Name
 5         {
 6             get { return name; }
 7         }
 8 
 9         decimal price;
10         public decimal Price
11         {
12             get { return price; }
13         }
14 
15         public Product(string name, decimal price)
16         {
17             this.name = name;
18             this.price = price;
19         }
20      
21         public static ArrayList GetSampleProducts()
22         {
23             ArrayList list = new ArrayList();
24             list.Add(new Product("West Side Story", 9.99m));
25             list.Add(new Product("Assassins", 14.99m));
26             list.Add(new Product("Frogs", 13.99m));
27             list.Add(new Product("Sweeney Todd", 10.99m));
28             return list;
29            
30         }
31 
32         public override string ToString()
33         {
34             return string.Format("{0}: {1}", name, price);
35           
36         }
37       
38 
39     }

威尼斯人线上娱乐 3威尼斯人线上娱乐 4

C#二 中的强类型集合

因C#第11中学尚无泛型,Product类中的静态方法GetSampleProducts,再次回到的是ArrayList类型,里面添加的因素只好是Product,而在C#第22中学的改变正是泛型。(新的情节用锌白列出)

 1 public class Product 2     { 3         string name; 4         public string Name 5         { 6             get { return name; } 7             private set { name = value; } 8         }10         decimal price;11         public decimal Price12         {13             get { return price; }14             private set { price = value; }15         }17         public Product(string name, decimal price)18         {19             Name = name;20             Price = price;21         }22         public static List<Product> GetSampleProducts()23         {24             List<Product> list = new List<Product>();25             list.Add(new Product("硬装芙蓉王", 25m));26             list.Add(new Product("精白沙", 9m));27             list.Add(new Product("软白沙", 5.5m));28             return list;29         }30         public override string ToString()31         {32             return string.Format("{0}:{1}", name, price);33         }34     }

C#贰 中的强类型集合

因C#1中从不泛型,Product类中的静态方法GetSampleProducts,再次回到的是ArrayList类型,里面添加的要素只可以是Product,而在C#第22中学的改变就是泛型。(新的始末用湖蓝列出)

 1 public class Product
 2     {
 3         string name;
 4         public string Name
 5         {
 6             get { return name; }
 7             private set { name = value; }
 8         }
10         decimal price;
11         public decimal Price
12         {
13             get { return price; }
14             private set { price = value; }
15         }
17         public Product(string name, decimal price)
18         {
19             Name = name;
20             Price = price;
21         }
22         public static List<Product> GetSampleProducts()
23         {
24             List<Product> list = new List<Product>();
25             list.Add(new Product("硬装芙蓉王", 25m));
26             list.Add(new Product("精白沙", 9m));
27             list.Add(new Product("软白沙", 5.5m));
28             return list;
29         }
30         public override string ToString()
31         {
32             return string.Format("{0}:{1}", name, price);
33         }
34     }

View Code

 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 }

优点:

  1. 品质有了个人赋值方法,且能够在构造函数中央银行使这几个赋值方法。
  2. List<Product>告知编辑器里面只可以分包Product,试图将贰个不一的体系丰盛到列表中,会导致编译时不当。并且在运用List<Product>时不供给转移结果的数据类型。

针对C#第11中学的存在的局限性,C#2消除了原本存在的前八个难题。

优点:

  1. 品质有了民用赋值方法,且可以在构造函数中选用这些赋值方法。
  2. List<Product>告知编辑器里面只好分包Product,试图将1个见仁见智的种类丰盛到列表中,会招致编写翻译时不当。并且在动用List<Product>时不须求转移结果的数据类型。

 针对C#1中的存在的局限性,C#二缓解了原来存在的前两个难题。

C#第22中学的强类型集合和私家的赋值方法

View Code

C#3 中活动达成的性格

相对C#2而言,C#3引进了机动属性和汇聚伊始化器。Product中的属性Name和Price,能够因而自行属性简化代码,而编写翻译器最后生成的代码是一律的。

 1 public class Product 2     { 3         public string Name{ get; private set; } 5         public decimal Price { get; private set; } 6         Product() { } 8         public Product(string name, decimal price) 9         {10             Name = name;11             Price = price;12         }14         public static List<Product> GetSampleProducts()15         {16             return new List<Product>17             {18                 new Product("硬装芙蓉王", 25m),19                 new Product("精白沙", 9m),20                 new Product("软白沙", 5.5m)21             };22         }24         public override string ToString()25         {26             return string.Format("{0}:{1}", Name, Price);27         }28     }

C#叁 中自行实现的习性

相对C#2而言,C#三引进了机关属性和聚众伊始化器。Product中的属性Name和Price,能够因此自行属性简化代码,而编写翻译器最后生成的代码是同样的。

 1 public class Product
 2     {
 3         public string Name{ get; private set; }
 5         public decimal Price { get; private set; }
 6         Product() { }
 8         public Product(string name, decimal price)
 9         {
10             Name = name;
11             Price = price;
12         }
14         public static List<Product> GetSampleProducts()
15         {
16             return new List<Product>
17             {
18                 new Product("硬装芙蓉王", 25m),
19                 new Product("精白沙", 9m),
20                 new Product("软白沙", 5.5m)
21             };
22         }
24         public override string ToString()
25         {
26             return string.Format("{0}:{1}", Name, Price);
27         }
28     }

威尼斯人线上娱乐 5威尼斯人线上娱乐 6

ArrayListSort类

优点:

  1. 尚无多余的变量与质量相关联,因为类中尚无了name和price变量,在类中选择品质名称是平等的。增强了代码的壹致性。
  2. 开创的数码列表的主意也统统区别。
  3. 有三个私人住房的无参构造函数,用于新的依据属性的伊始化。

 优点:

  1. 没有剩余的变量与品质相关联,因为类中并未有了name和price变量,在类中运用性质名称是千篇一律的。增强了代码的一致性。
  2. 开创的数目列表的措施也全然差异。
  3. 有2个私家的无参构造函数,用于新的基于属性的初始化。
 1  public class Product
 2     {
 3         string name;
 4         public string Name
 5         {
 6             get { return name; }
 7             private set { Name = value; } 私有的赋值方法
 8         }
 9 
10         decimal price;
11         public decimal Price
12         {
13             get { return price; }
14             private set { Price = value; }
15         }
16         //C#3:Product(){}
17         public Product(string name, decimal price)
18         {
19            
20               Name = name;
21               Price = price;
22         }
23       public static List<Product>GetSampleProducts()
24         {
25              List<Product>list= new List<Product>();
26             list.Add(new Product("West Side Story", 9.99m));
27             list.Add(new Product("Assassins", 14.99m));
28             list.Add(new Product("Frogs", 13.99m));
29             list.Add(new Product("Sweeney Todd", 10.99m));
30             return list;
31            
32         }
33 
34         public override string ToString()
35         {
36             return string.Format("{0}: {1}", name, price);
37           
38         }
39 
40     }

威尼斯人线上娱乐 7威尼斯人线上娱乐 8

C# 四 中的命名实参

在C#四中引进了命名实参,所谓命名实参是指命名参数调用实参顺序能够和形参区别。

 1 public class Product 2     { 3         readonly string name; 4         public string Name 5         { 6             get { return name; } 7         } 9         readonly decimal price;10         public decimal Price11         {12             get { return price; }13         }15         public Product(string name, decimal price)16         {17             this.name = name;18             this.price = price;19         }20         public static List<Product> GetSampleProducts()21         {22             List<Product> list = new List<Product>();23             list.Add(new Product(name: "硬装芙蓉王", price: 25m));24             list.Add(new Product(name: "精白沙", price: 9m));25             list.Add(new Product(name: "软白沙", price: 5.5m));26             return list;27         }28         public override string ToString()29         {30             return string.Format("{0}:{1}", name, price);31         }32     }

威尼斯人线上娱乐 9

C# 4 中的命名实参

 在C#四中引进了命名实参,所谓命名实参是指命名参数调用实参顺序能够和形参分化。

 1 public class Product
 2     {
 3         readonly string name;
 4         public string Name
 5         {
 6             get { return name; }
 7         }
 9         readonly decimal price;
10         public decimal Price
11         {
12             get { return price; }
13         }
15         public Product(string name, decimal price)
16         {
17             this.name = name;
18             this.price = price;
19         }
20         public static List<Product> GetSampleProducts()
21         {
22             List<Product> list = new List<Product>();
23             list.Add(new Product(name: "硬装芙蓉王", price: 25m));
24             list.Add(new Product(name: "精白沙", price: 9m));
25             list.Add(new Product(name: "软白沙", price: 5.5m));
26             return list;
27         }
28         public override string ToString()
29         {
30             return string.Format("{0}:{1}", name, price);
31         }
32     }

威尼斯人线上娱乐 10

View Code

 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 }

按名称对成品实行排序

列表排序最简便易行的格局正是先将列表排好序,然后遍历并体现当中的项。在上述代码C#
第11中学,Product类中的静态方法GetSampleProducts,重回的是ArrayList类型,大家渴求运用ArrayList.Sort,供给提供三个IComparer完成。落成代码如下:

1  public class ProductNameComparer : IComparer2     {3         public int Compare(object x, object y)4         {5             Product i = x;6             Product j = y;7             return i.Name.CompareTo;8         }9     }

 1  static void Main(string[] args) 2         { 3             ArrayList arraylist = Product.GetSampleProducts(); 4             arraylist.Sort(new ProductNameComparer; 5             foreach(Product pr in arraylist) 6             { 7                 Console.WriteLine; 8             } 9             Console.Read();10         }

按名称对成品实行排序

列表排序最简易的办法就是先将列表排好序,然后遍历并出示中间的项。在上述代码C#
1中,Product类中的静态方法Get萨姆pleProducts,再次回到的是ArrayList类型,大家渴求使用 ArrayList.Sort,要求提供一个IComparer实现。实现代码如下:

1  public class ProductNameComparer : IComparer
2     {
3         public int Compare(object x, object y)
4         {
5             Product i = (Product)x;
6             Product j = (Product)y;
7             return i.Name.CompareTo(j.Name);
8         }
9     }

 1  static void Main(string[] args)
 2         {
 3             ArrayList arraylist = Product.GetSampleProducts();
 4             arraylist.Sort(new ProductNameComparer());
 5             foreach(Product pr in arraylist)
 6             {
 7                 Console.WriteLine(pr.Name);
 8             }
 9             Console.Read();
10         }

C#叁机动达成的性质和更简短的初阶化

View Code

缺点:

  1. 非得引进额外的门类来扶助排序。
  2. Compare 方法中的强制类型转换。
  3. 要是ArrayList包括三个字符串货其余门类,那么代码会出错——因为在比较时会将字符串强制转型为
    Product 。
  4. foreach 循环会隐式将列表中的每种成分转换为 Product
    类型,借使内部蕴藏字符串或任何类型,同样会报错。

然后在C#第22中学引进泛型了能够扶持大家缓解上述难题。

1 public class ProductNameComparer : IComparer<Product>2     {3         public int Compare(Product x, Product y)4         {5             return x.Name.CompareTo;6         }7     }

 1  static void Main(string[] args) 2         { 3             List<Product> arraylist = Product.GetSampleProducts(); 4             arraylist.Sort(new ProductNameComparer; 5             foreach(Product pr in arraylist) 6             { 7                 Console.WriteLine; 8             } 9             Console.Read();10         }

 缺点:

  1. 非得引进额外的品种来帮助排序。
  2. Compare 方法中的强制类型转换。
  3. 假使ArrayList包蕴二个字符串货别的门类,那么代码会出错——因为在可比时会将字符串强制转型为
    Product 。 
  4. foreach 循环会隐式将列表中的各个成分转换为 Product
    类型,假若内部蕴涵字符串或任何类型,同样会报错。

然后在C#第22中学引进泛型了足以扶持大家化解上述难题。

1 public class ProductNameComparer : IComparer<Product>
2     {
3         public int Compare(Product x, Product y)
4         {
5             return x.Name.CompareTo(y.Name);
6         }
7     }

 1  static void Main(string[] args)
 2         {
 3             List<Product> arraylist = Product.GetSampleProducts();
 4             arraylist.Sort(new ProductNameComparer());
 5             foreach(Product pr in arraylist)
 6             {
 7                 Console.WriteLine(pr.Name);
 8             }
 9             Console.Read();
10         }

威尼斯人线上娱乐 11威尼斯人线上娱乐 12

提供二个IComparer完结,相比器。也许Product类达成IComparable。

优点:

  1. 早先提供的正是Product(而相当的小概是别的系列),在Compare方法中不供给展开强制类型转换。
  2. foreach也不用隐式的类型转换。

万壹大家不愿意引进额外的品类来支援排序,而是直接对列表排序。C#2运用委托来排序。代码如下:

 1 static void Main(string[] args) 2         { 3             List<Product> arraylist = Product.GetSampleProducts(); 4             arraylist.Sort(delegate(Product x, Product y) 5             { 6                 return x.Name.CompareTo; 7             }); 8             foreach (Product pr in arraylist) 9             {10                 Console.WriteLine;11             }12 13         }

C#叁能够将匿超级模特式替换来Lambda表达式的措施实行排序。

 1 static void Main(string[] args) 2         { 3             List<Product> arraylist = Product.GetSampleProducts(); 4             arraylist.Sort => x.Name.CompareTo; 5             foreach (Product pr in arraylist) 6             { 7                 Console.WriteLine; 8             } 9             Console.Read();10         }

C#三利用扩大方法进行排序。

1 static void Main(string[] args)2         {3             List<Product> arraylist = Product.GetSampleProducts();4             foreach (Product pr in arraylist.OrderBy(p => p.Name))5             {6                 Console.WriteLine;7             }8             Console.Read();9         }

威尼斯人线上娱乐 13

 优点:

  1. 初步提供的便是Product(而不或者是别的连串),在Compare方法中不要求展开强制类型转换。
  2. foreach也不用隐式的类型转换。

只要大家不希望引进额外的项目来协助排序,而是直接对列表排序。C#2用到委托来排序。代码如下:

 1 static void Main(string[] args)
 2         {
 3             List<Product> arraylist = Product.GetSampleProducts();
 4             arraylist.Sort(delegate(Product x, Product y)
 5             {
 6                 return x.Name.CompareTo(y.Name);
 7             });
 8             foreach (Product pr in arraylist)
 9             {
10                 Console.WriteLine(pr.Name);
11             }
12 13         } 

C#三可以将匿名情势替换来拉姆da表达式的章程进行排序。 

 1 static void Main(string[] args)
 2         {
 3             List<Product> arraylist = Product.GetSampleProducts();
 4             arraylist.Sort((x, y) => x.Name.CompareTo(y.Name));
 5             foreach (Product pr in arraylist)
 6             {
 7                 Console.WriteLine(pr.Name);
 8             }
 9             Console.Read();
10         }

 C#3 使用扩大方法开始展览排序。 

1 static void Main(string[] args)
2         {
3             List<Product> arraylist = Product.GetSampleProducts();
4             foreach (Product pr in arraylist.OrderBy(p => p.Name))
5             {
6                 Console.WriteLine(pr.Name);
7             }
8             Console.Read();
9         }

 威尼斯人线上娱乐 14

 1  public class Product
 2     {
 3         public string Name { get; private set; }
 4         public string Price { get; private set; }
 5 
 6         public Product(string name, decimal price)
 7         {
 8            
 9               Name = name;
10               Price = price;
11         }
12 
13         private Product()
14         {
15         }
16 
17         public static List<Product> GetSampleProducts()
18         {
19             return new List<Product>
20             {
21                 new Product {Name = "West Side Story", Price = 9.99m},
22                 new Product {Name = "Assassins", Price = 14.99m},
23                 new Product {Name = "Frogs", Price = 13.99m},
24                 new Product {Name = "Sweeney Todd", Price = 10.99m}
25             };
26         }
27 
28         public override string ToString()
29         {
30             return string.Format("{0}: {1}", Name, Price);
31         }
32       
33     }

区别:IComparer和IComparable(相比较器接口和可正如的接口)

查询集合

摸索集合中符合条件的装有因素,是壹件非常粗略的事情,大家来壹块来看C#1、C#2、C#中间查询集合的不如。

现要求查找价格高于20的出品消息。

C#1代码:

 1 static void Main(string[] args) 2         { 3             ArrayList arraylist = Product.GetSampleProducts(); 4             foreach (Product pr in arraylist) 5             { 6                 if (pr.Price > 20) 7                 { 8                     Console.WriteLine; 9                 }10             }11             Console.Read();12         }

C#2代码:

 1 static void Main(string[] args) 2         { 3             List<Product> list = Product.GetSampleProducts(); 4             Predicate<Product> test = delegate(Product p) //设定查询条件 5             { 6                 return p.Price > 20; 7             }; 8             List<Product> all = list.FindAll;      //查询所有价格大于20的产品,并保存到all中 9             Action<Product> pro = Console.WriteLine;     //输出产品信息10             all.ForEach; //循环输出产品信息11             Console.Read();12         }

C#2其余1个版本代码:

1 static void Main(string[] args)2         {3             List<Product> list = Product.GetSampleProducts();4             list.FindAll(delegate(Product p) //设定查询条件5             {6                 return p.Price > 20;7             }).ForEach(Console.WriteLine);8             Console.Read();9         }

C#3代码:

1 static void Main(string[] args)2         {3             List<Product> list = Product.GetSampleProducts();4             list.FindAll(p => { return p.Price > 20; }).ForEach(Console.WriteLine);5             Console.Read();6         }

1 static void Main(string[] args)2         {3             List<Product> list = Product.GetSampleProducts();4             foreach (Product pro in list.Where(p => p.Price > 20))5             {6                 Console.WriteLine;7             }8             Console.Read();9         }

威尼斯人线上娱乐 15

那篇就写到那里。下篇大家将继续学习《深切掌握C#》的连带知识。

询问集合

摸索集合中符合条件的具备因素,是壹件很简短的事务,我们来一块来看C#1、C#2、C#中间查询集合的不及。

现要求查找价格高于20的出品消息。

C#1代码:

 1 static void Main(string[] args)
 2         {
 3             ArrayList arraylist = Product.GetSampleProducts();
 4             foreach (Product pr in arraylist)
 5             {
 6                 if (pr.Price > 20)
 7                 {
 8                     Console.WriteLine(pr);
 9                 }
10             }
11             Console.Read();
12         }

 C#2代码:

 1 static void Main(string[] args)
 2         {
 3             List<Product> list = Product.GetSampleProducts();
 4             Predicate<Product> test = delegate(Product p) //设定查询条件
 5             {
 6                 return p.Price > 20;
 7             };
 8             List<Product> all = list.FindAll(test);      //查询所有价格大于20的产品,并保存到all中
 9             Action<Product> pro = Console.WriteLine;     //输出产品信息
10             all.ForEach(pro); //循环输出产品信息
11             Console.Read();
12         }

 C#贰其它一个版本代码:

1 static void Main(string[] args)
2         {
3             List<Product> list = Product.GetSampleProducts();
4             list.FindAll(delegate(Product p) //设定查询条件
5             {
6                 return p.Price > 20;
7             }).ForEach(Console.WriteLine);
8             Console.Read();
9         }

 C#3代码:

1 static void Main(string[] args)
2         {
3             List<Product> list = Product.GetSampleProducts();
4             list.FindAll(p => { return p.Price > 20; }).ForEach(Console.WriteLine);
5             Console.Read();
6         }

1 static void Main(string[] args)
2         {
3             List<Product> list = Product.GetSampleProducts();
4             foreach (Product pro in list.Where(p => p.Price > 20))
5             {
6                 Console.WriteLine(pro);
7             }
8             Console.Read();
9         }

威尼斯人线上娱乐 16

那篇就写到那里。下篇大家将继续读书《深入精晓C#》的有关文化。

View Code

缺点:Compare方法中显得强制类型转换,而ArrayList是项目不安全的,转换为对象Product时只怕报错。foreach循环中隐式的编写翻译器自动类型转换,转换为Product类型执行时可能报错。

C#四中命名实参

2.C#二.0
引进泛型,使用IComparer<Product>对List<Product>实行排序

威尼斯人线上娱乐 17威尼斯人线上娱乐 18

product类

 1 public class Product
 2     {
 3      
 4         public override string ToString()
 5         {
 6             return string.Format("{0}: {1}", name, price);
 7         }
 8         //C#4中的参数:尽管私有赋值不能被公共的改变,但如果要求它也不能被私有的改变,将会更加的清晰,在C#4中,我们用调用构造函数时指定实参的名称
 9         readonly string name;
10         public string Name { get { return name; } }
11         return new List<Product>
12         {
13             new Product {name = "West Side Story", price = 9.99m},
14             new Product {name = "Assassins", price = 14.99m},
15             new Product {name = "Frogs", price = 13.99m},
16             new Product {name = "Sweeney Todd", price = 10.99m},
17         };
18 
19 
20     }

威尼斯人线上娱乐 19威尼斯人线上娱乐 20

View Code

 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 }

2、排序和过滤的衍变

View Code

 1、排序

ListSortWithComparer类

C#第11中学利用IComparer对ArrayList实行排序

威尼斯人线上娱乐 21威尼斯人线上娱乐 22

威尼斯人线上娱乐 23威尼斯人线上娱乐 24

 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 }
 1 class ProductNameComparer : IComparer
 2         {
 3             public int Compare(object x, object y)
 4             {
 5                 Product first = (Product)x;
 6                 Product second = (Product)y;
 7                 return first.Name.CompareTo(second.Name);
 8             }
 9         }
10  static void Main()
11         {
12             ArrayList products = Product.GetSampleProducts();
13             products.Sort(new ProductNameComparer());
14             foreach (Product product in products)
15             {
16                 Console.WriteLine(product);
17             }
18         }

View Code

View Code

行使Comparison<Product>对List<Product>进行排序(C#2),不需求贯彻ProductNameComparer相比器类型,只是成立多个信托实例(C#2.0
匿名格局)。

C#第22中学动用IComparer<product>对List<Product>进行排序

威尼斯人线上娱乐 25威尼斯人线上娱乐 26

威尼斯人线上娱乐 27威尼斯人线上娱乐 28

 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 }
 1  class ProductNameComparer : IComparer<Product>
 2         {
 3             public int Compare(Product x, Product y)
 4             {
 5                 return x.Name.CompareTo(y.Name);
 6             }
 7         }
 8 static void Main()
 9 {
10  List<Product> products = Product.GetSampleProducts();
11  products.Sort(new ProductNameComparer());
12             foreach (Product product in products)
13             {
14                 Console.WriteLine(product);
15             }
16 }

View Code

View Code

3.C#三.0 拉姆da表明式
在Lambda表明式中利用Comparison<Product>实行排序(C#3)

C#第22中学央银行使委托进行相比较

product类

威尼斯人线上娱乐 29威尼斯人线上娱乐 30

威尼斯人线上娱乐 31威尼斯人线上娱乐 32

1  /* 
2          * C#2的方法1确实有了一定的改进,但是我们希望能直接指定要进行的标胶,就能开始对产品进行排序,而不需要实现一个接口来做这件事
3          * 下面它告诉sort方法如何用一个委托来比较俩个产品.省略了接口实现的代码和products.Sort(new ProductNameComparer());
4          * List<Product> products = Product.GetSampleProducts();
5          * products.Sort(delegate (Product x,Product y)
6          * {return x.Name.CompareTo(y.Name);}
7          * );
8          */
 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

View Code

C#叁中使用lambda表明式实行比较

ListSortWithLambdaExpression类

威尼斯人线上娱乐 33威尼斯人线上娱乐 34

威尼斯人线上娱乐 35威尼斯人线上娱乐 36

 1  List<Product> products = Product.GetSampleProducts();
 2 products.Sort((x,y)=>x.Name.CompareTo(y.Name));
 3 foreach(Product product in products)
 4 {
 5          console.writeline(product);
 6 }
 7 C#3还有另一种写法排序
 8 foreach(Product product in product.OrderBy(p=>p.Name))
 9 {
10          console.writeline(product);//通知轻松的按顺序打印名称,同时不必修改原产品列表
11 }
 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

View Code

  2、查询

ListOrderWithExtensionMethod类 使用扩充方法对List<Product>实行排序

   循环、测试和打印(C#1)

威尼斯人线上娱乐 37威尼斯人线上娱乐 38

威尼斯人线上娱乐 39威尼斯人线上娱乐 40

 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 }
1  ArrayList products = Product.GetSampleProducts();
2             foreach (Product product in products.Cast<Product>().Where(product => product.Price > 10m))
3             {
4                 Console.WriteLine(product);
5             }

View Code

View Code

总结:

  测试和打字与印刷分开进行(C#2)

→C#1,弱类型的比较效益不接济委托排序。

威尼斯人线上娱乐 41威尼斯人线上娱乐 42

→C#2,强类型的可比效益,委托相比较,匿名方式。

1 List<Product> products =Product.GetSampleProducts();
2           Predicate<Product> test = delegate(Product p){ return p.Price > 10m;};
3            List<Product>  matches=products.FindAll(test);
4           Action<Product> print=console.writeLine;
5           matches.ForEach(print);

→C#三拉姆da表达式,扩展方法,允许列表保持未排序状态。

View Code

测试和打字与印刷分开实行的另3个版本(C#2)

List<Product> products =Product.GetSampleProducts();
products.FindAll(delegate (Product p){ return p.Price >10;}).ForEach(Console.WriteLine);

用lambda表明式来拓展测试(c#3)

List<Product> products =Product.GetSampleProducts();
foreach(Product product in products.Where(p=>p.price>10))
{
    Console.WriteLine(product);
}

C#中使用Linq表达式

foreach (Product product in products.Cast<Product>().Where(product => product.Price > 10m))
{
Console.WriteLine(product);
}

 


相关文章

发表评论

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

网站地图xml地图