美高梅网投网站-美高梅手机网投-美高梅官方网站
做最好的网站

您的位置:美高梅网投网址 > 美高梅网站 > 美高梅网投网站本书主要探讨C,提供一个ICompa

美高梅网投网站本书主要探讨C,提供一个ICompa

发布时间:2019-11-06 22:15编辑:美高梅网站浏览(167)

    二、排序Product

    引言

    在起来看那本书以前看过部分技巧博客,增加补充自个儿对此部分知识点的青黄不接。无意中发掘了《深刻明白C#》那本书,本书主要斟酌C# 2、C# 3和C# 4的内情与特点,所以做了一下阅读笔记,迎接拍砖。

    1.按名称对成品实行排序,以特定顺序显示三个列表的最简便方法便是先将列表排序,再遍历并展现当中的项。

    目录

    • 从简单的数据类型开端
      • C# 1 中定义的制品档次
      • C# 2 中的强类型集合
      • C# 3 中自行达成的性格
      • C# 4 中的命名实参
    • 排序和过滤
      • 按名称对产品进行排序
      • 询问群集

    C#1.1 使用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     }
    

    product类

    缺点:

    1. ArrayList未有提供内部有关编写翻译时的音信。大家很有非常大概率在GetSampleProducts方法中加多三个字符串到ArrayList中,因为ArrayList的Add方法中的参数是object,而编辑器并不曾其余反响。
    2. 代码中提供了品质的取值方法,要是加上对应的赋值方法,那么赋值方法也非得是国有的主意。
    3. 制造属性的代码过于复杂。

    美高梅网投网站 1美高梅网投网站 2

    C#2 中的强类型集结

    因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     }
    
     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减轻了本来存在的前五个难点。

    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     }
    

    ArrayListSort类

    优点:

    1. 从未剩余的变量与品质相关联,因为类中绝非了name和price变量,在类中利用性质名称是相同的。增强了代码的风姿罗曼蒂克致性。
    2. 美高梅网投网站,创办的数额列表的形式也统统分裂。
    3. 有多少个私人民居房的无参构造函数,用于新的依附属性的起初化。

    美高梅网投网站 3美高梅网投网站 4

    C# 4 中的命名实参

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

     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     }
    

    美高梅网投网站 5

     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类中的静态方法Get萨姆pleProducts,重回的是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         }
    

    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         }
    

    美高梅官方网站,提供贰个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#3 能够将佚名格局替换到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#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;7             }8             Console.Read();9         }
    

    美高梅网投网站 6

    有别于: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 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         }
    

    美高梅网投网站 7

    那篇就写到这里。下篇我们将继续攻读《深刻通晓C#》的连带文化。

    缺欠:Compare方法中体现强制类型调换,而ArrayList是项目不安全的,调换为对象Product时大概报错。foreach循环中隐式的编写翻译器自动类型转变,转变为Product类型执行时可能报错。

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

    product类

    美高梅网投网站 8美高梅网投网站 9

     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类

    美高梅网投网站 10美高梅网投网站 11

     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 匿有名的模特式)。

    美高梅网投网站 12美高梅网投网站 13

     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表明式 在拉姆da表明式中利用Comparison<Product>进行排序(C#3)

    product类

    美高梅网投网站 14美高梅网投网站 15

     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类

    美高梅网投网站 16美高梅网投网站 17

     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>实行排序

    美高梅网投网站 18美高梅网投网站 19

     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表明式,扩充方法,允许列表保持未排序状态。

    本文由美高梅网投网址发布于美高梅网站,转载请注明出处:美高梅网投网站本书主要探讨C,提供一个ICompa

    关键词: