程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 01.C#數據類型、排序、過濾(一章1.1-1.2)

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

編輯:C#入門知識

01.C#數據類型、排序、過濾(一章1.1-1.2)。本站提示廣大學習愛好者:(01.C#數據類型、排序、過濾(一章1.1-1.2))文章只能為提供參考,不一定能成為您想要的結果。以下是01.C#數據類型、排序、過濾(一章1.1-1.2)正文


參考頁面:

http://www.yuanjiaocheng.net/CSharp/csharp-generic-dictionary.html

http://www.yuanjiaocheng.net/CSharp/csharp-partial-class.html

http://www.yuanjiaocheng.net/CSharp/csharp-Static.html

http://www.yuanjiaocheng.net/CSharp/csharp-Anonymous-method.html

http://www.yuanjiaocheng.net/CSharp/csharp-nullable.html

  隨著看的文章及討論越多,越發現自己真實太不定性了,看下《C#深化了解》吧,做一下讀書筆記,從中發現自己的缺乏。閒話不說,進入正題吧。

  在C#1中定下一個復雜的數據類型

 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類中的靜態辦法前往是的ArrayList類型,外面的元素類型當然是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,關於屬性的改良,則是引入自動完成屬性的概念,Product1和Product2中公有屬性name和price,可以經過自動屬性停止書寫,如下

 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中對類的完成次要表現在類的實例化中,引入命名實參,留意上面GetProducts辦法中類對象的實例化

 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),格式如[參數:參數值],在實例化中可以顯示的指定參數的值。

  接上去說下C#退化進程中對排序辦法的完成

  在C#1中,需求定義一個完成於IComparer接口的類

 1 //運用IComparer對ArrayList停止排序
 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     }

  在功用頁面要對上述類實例化

 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類型有一個地下的接口(用於排序Sort),傳入的參數是完成IComparer接口的一個實例,正好我們下面定義的ComparerName1(依據產品的名字來排序),那麼在C#2中又是如何完成?

正如後面所說C#2引入泛型的概念(對應的產品類為Product2類),定義一個完成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一樣,次要區別在於ComparerName1中需求將Object類型強迫轉換成Product1類型,而在運用泛型的狀況下,由於曾經知道了詳細的類型,則防止了強迫轉換帶來的功能損耗

  C#3中的自動屬性關於排序沒有作用,但是可以運用引入的Lambda表達式對排序代碼的進一步精簡。

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             //在C#3中運用Lambda表達式停止排序
 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表達式的完成其實是委托,用於委托完成也是一樣的。

  上面來說下關於查詢、打印的完成。

C#1

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             ArrayList list = Product1.GetProducts();
 6             /*
 7                 C#1運用查詢、測試、打印
 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中的查詢完成可以運用委托

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<Product2> list = Product2.GetProducts();
 6 
 7             //C#2運用匿名辦法創立委托
 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     }

  後果和C#1中是一樣的,打印價錢大於2產品的稱號,到了C#3則更精簡了,由於有了Lambda表達式

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

  寫到這裡,我們有理由置信,Lambda表達式就是變相的委托,則可以引入一個想法,在運用委托的時分均可以運用Lambda表達式替代。great!!!

  請指正。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved