国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

01.C#數(shù)據(jù)類型、排序、過濾(一章1.1-1.2)

2019-11-17 02:41:28
字體:
供稿:網(wǎng)友

01.C#數(shù)據(jù)類型、排序、過濾(一章1.1-1.2)

  隨著看的文章及探討越多,越發(fā)現(xiàn)自己實(shí)在太不定性了,看下《C#深入理解》吧,做一下讀書筆記,從中發(fā)現(xiàn)自己的不足。閑話不說,進(jìn)入正題吧。

  在C#1中定下一個(gè)簡(jiǎn)單的數(shù)據(jù)類型

 1 public class PRoduct1 2     { 3         private string name; 4         private long price; 5  6         public string Name { get { return name; } } 7         public long Price { get { return price; } } 8  9         public Product1(string n, long p)10         {11             this.name = n;12             this.price = p;13         }14 15         public static ArrayList GetProducts()16         {17             ArrayList list = new ArrayList();18             list.Add(new Product1("cat", 1));19             list.Add(new Product1("fish", 2));20             list.Add(new Product1("dog", 3));21             list.Add(new Product1("pig", 4));22             return list;23         }24     }

  C#1中沒有泛型的概念,在Product1類中的靜態(tài)方法返回是的ArrayList類型,里面的元素類型當(dāng)然是Product1。而在C#2中引入泛型后,該類可定義為(重命名為Product2)

 1 public class Product2 2     { 3         private string name; 4         private long price; 5  6         public string Name { get { return name; } private set { name = value; } } 7         public long Price { get { return price; } private set { price = value; } } 8  9         public Product2(string n, long p)10         {11             Name = n;12             Price = p;13         }14 15         public static List<Product2> GetProducts()16         {17             List<Product2> list = new List<Product2>();18             list.Add(new Product2("cat", 1));19             list.Add(new Product2("fish", 2));20             list.Add(new Product2("dog", 3));21             list.Add(new Product2("pig", 4));22             return list;23         }24     }

  相比較于C#3,對(duì)于屬性的改進(jìn),則是引入自動(dòng)實(shí)現(xiàn)屬性的概念,Product1和Product2中私有屬性name和price,可以通過自動(dòng)屬性進(jìn)行書寫,如下

 1 class Product3 2     { 3         public string Name { get; private set; } 4         public long Price { get; private set; } 5  6         public Product3(string n, long p) 7         { 8             Name = n; 9             Price = p;10         }11 12         public static List<Product3> GetProducts()13         {14             List<Product3> list = new List<Product3> {15                 new Product3("cat",1),16                 new Product3("fish",2),17                 new Product3("dog",3),18                 new Product3("pig",4)19             };20             return list;21         }22     }

  C#4中對(duì)類的實(shí)現(xiàn)主要體現(xiàn)在類的實(shí)例化中,引入命名實(shí)參,注意下面GetProducts方法中類對(duì)象的實(shí)例化

 1 class Product4 2     { 3         readonly string name; 4         readonly long price; 5         public string Name { get { return name; } } 6         public long Price { get { return price; } } 7  8         public Product4(string n, long p) 9         {10             name = n;11             price = p;12         }13 14         public static List<Product4> GetProducts()15         {16             return new List<Product4>17             {18                 new Product4(n:"cat",p:1),19                 new Product4(n:"fish",p:2),20                 new Product4(n:"dog",p:3),21                 new Product4(n:"pig",p:4)22             };23         }24     }

  如new Product4(n:"cat",p:1),格式如[參數(shù):參數(shù)值],在實(shí)例化中可以顯示的指定參數(shù)的值。

  接下來說下C#進(jìn)化過程中對(duì)排序方法的實(shí)現(xiàn)

  在C#1中,需要定義一個(gè)實(shí)現(xiàn)于IComparer接口的類

 1 //使用IComparer對(duì)ArrayList進(jìn)行排序 2     public class ComparerName1 : IComparer 3     { 4         public int Compare(object x, object y) 5         { 6             Product1 p1 = (Product1)x; 7             Product1 p2 = (Product1)y; 8             return p1.Name.CompareTo(p2.Name); 9         }10     }

  在功能頁面要對(duì)上述類實(shí)例化

 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             ArrayList list = Product1.GetProducts(); 6  7             list.Sort(new ComparerName1()); 8  9             foreach (Product1 p in list)10             {11                 Console.WriteLine(p.Name);12             }13             Console.ReadKey();14 15         }16     }

  可以看出ArrayList類型有一個(gè)公開的接口(用于排序Sort),傳入的參數(shù)是實(shí)現(xiàn)IComparer接口的一個(gè)實(shí)例,正好我們上面定義的ComparerName1(根據(jù)產(chǎn)品的名字來排序),那么在C#2中又是如何實(shí)現(xiàn)?

正如前面所說C#2引入泛型的概念(對(duì)應(yīng)的產(chǎn)品類為Product2類),定義一個(gè)實(shí)現(xiàn)IComparer<Product2>接口的類即可

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

  在功能頁面使用方法和C#1一樣,主要區(qū)別在于ComparerName1中需要將Object類型強(qiáng)制轉(zhuǎn)換成Product1類型,而在使用泛型的情況下,因?yàn)橐呀?jīng)知道了具體的類型,則避免了強(qiáng)制轉(zhuǎn)換帶來的性能損耗。

  C#3中的自動(dòng)屬性對(duì)于排序沒有作用,但是可以使用引入的Lambda表達(dá)式對(duì)排序代碼的進(jìn)一步精簡(jiǎn)。

 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             //在C#3中使用Lambda表達(dá)式進(jìn)行排序 6             List<Product3> list = Product3.GetProducts(); 7  8             list.Sort( 9                 (x, y) => x.Name.CompareTo(y.Name)10             );11 12             foreach (Product3 p in list)13             {14                 Console.WriteLine(p.Name);15             }16             Console.ReadKey();17         }18     }

  Lambda表達(dá)式的實(shí)現(xiàn)其實(shí)是委托,用于委托實(shí)現(xiàn)也是一樣的。

  下面來說下對(duì)于查詢、打印的實(shí)現(xiàn)。

C#1

 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             ArrayList list = Product1.GetProducts(); 6             /* 7                 C#1使用查詢、測(cè)試、打印 8             */ 9             foreach (Product1 p in list)10             {11                 if (p.Price > 2)12                 {13                     Console.WriteLine(p.Name);14                 }15             }16             Console.ReadKey();17 18         }19     }

  C#2中的查詢實(shí)現(xiàn)可以使用委托

 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             List<Product2> list = Product2.GetProducts(); 6  7             //C#2使用匿名方法創(chuàng)建委托 8  9             Predicate<Product2> test = delegate (Product2 p) { return p.Price > 2; };10             List<Product2> matches = list.FindAll(test);11             Action<Product2> print = delegate (Product2 p) { Console.WriteLine(p.Name); }; ;12             matches.ForEach(print);13             list.FindAll(test).ForEach(print);14 15             Console.ReadKey();16 17         }18     }

  結(jié)果和C#1中是一樣的,打印價(jià)格大于2產(chǎn)品的名稱,到了C#3則更精簡(jiǎn)了,因?yàn)橛辛薒ambda表達(dá)式

 1 class Program 2     { 3         static void Main(string[] args) 4         { 5             List<Product3> list = Product3.GetProducts(); 6  7             //C#3中使用Lambda表達(dá)式進(jìn)行查詢 8             list.FindAll(x => x.Price > 2).ForEach(x => Console.WriteLine(x.Name)); 9 10             Console.ReadKey();11 12         }13     }

  寫到這里,我們有理由相信,Lambda表達(dá)式就是變相的委托,則可以引入一個(gè)想法,在使用委托的時(shí)候均可以使用Lambda表達(dá)式替代。great?。。?/p>

  請(qǐng)斧正。


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 济宁市| 天津市| 津南区| 嘉定区| 阳谷县| 达尔| 河南省| 梅州市| 阳原县| 来凤县| 额济纳旗| 樟树市| 淮安市| 慈溪市| 大兴区| 海兴县| 沙田区| 鄯善县| 孝昌县| 侯马市| 惠水县| 调兵山市| 博湖县| 永吉县| 保定市| 胶南市| 澄江县| 怀来县| 略阳县| 碌曲县| 太保市| 定日县| 盈江县| 双桥区| 罗源县| 满洲里市| 会宁县| 长沙县| 灵山县| 玛曲县| 大关县|