C#十種語法糖

語法糖程序員

指計算機語言中添加的某種語法,這種語法對語言的功能並無影響,可是更方便程序員使用。一般來講使用語法糖可以增長程序的可讀性,從而減小程序代碼出錯的機會。
須要聲明的是「語法糖」這個詞絕非貶義詞,它能夠給咱們帶來方便,是一種便捷的寫法,編譯器會幫咱們作轉換,並且能夠提升開發編碼的效率,在性能上也不會帶來損失。數據庫

1、自動屬性數組

之前:手寫私有變量+公有屬性
如今:聲明空屬性,編譯器自動生成對應私有成員字段。函數

寫法:輸入prop ,連續按兩次tab鍵,自動生成屬性。性能

 1         /// <summary>
 2         /// 自動屬性
 3         /// </summary>
 4         public string Name { get; set; }
 5 
 6         /// <summary>
 7         /// 傳統屬性寫法
 8         /// </summary>
 9         private string _LoginName;
10 
11         public string LoginName
12         {
13             get { return _LoginName; }
14             set { _LoginName = value; }
15         }

 2、隱式類型(var)this

var定義變量有如下四個特色:
程序員在聲明變量時能夠不指定類型,由編譯器根據值來指定類型
一、必須在定義時初始化
二、一旦初始化完成,就不能再給變量賦與初始值不一樣類型的值了
三、var要求是局部變量
四、使用var定義變量和object不一樣,它在效率上和使用強類型方式定義變量徹底同樣編碼

注意:
a.隱式類型在定義時必須初始化
例如:var name; 錯  var name="Tom";正確
b.能夠用同類型的其餘隱式類型變量來初始化新的隱式類型變量
例如:var v=1;
      var v2=v;
c.也能夠用同類型的字面量來初始化隱式類型變量
例如: var v3="hello";
      v3="world";
d.隱式類型局部變量還能夠初始化數組而不指定類型
例如: var array=new int[]{1,2,3,4,5}; (注意:賦值運算符左邊沒有方括號)
e.編譯器能夠根據變量的初始值「推斷」變量的類型
例如: var number=0;  編譯後就變成了  int number =0;spa

3、參數默認值和命名參數.net

    C#方法的可選參數是.net 4.0最新提出的新的功能,對應簡單的重載可使用可選參數和命名參數混合的形式來定義方法,這樣就能夠很高效的提升代碼的運行效率
    設計一個方法的參數時,能夠部分或所有參數分配默認值。調用其方法時,能夠從新指定分配了默認值的參數,也可使用默認值。從新指定分配默認值的參數時,能夠顯式地爲指定參數名稱賦值;隱式指定的時候,是根據方法參數的順序,靠C#編譯器的推斷。翻譯

使用的指導原則:
一、能夠爲方法和有參屬性指定默認值
二、有默認值的參數,必須定義在沒有默認值的參數以後
三、默認參數必須是常量
四、ref和out參數不能指定默認值

 1  public class User
 2     {
 3         /// <summary>
 4         /// 自動屬性
 5         /// </summary>
 6         public string Name { get; set; }
 7 
 8         public string LoginName { get; set; }
 9 
10         public int Age { get; set; }
11 
12         public string  Address { get; set; }
13 
14         public string  Password { get; set; }
15 
16         //構造函數重載
17         public User(string name)
18         {
19             this.Name = name;
20         }
21 
22         public User(string name,string loginName)
23         {
24             this.Name = name;
25             this.LoginName = loginName;
26         }
27 
28         /// <summary>
29         /// 默認參數
30         /// </summary>
31         /// <param name="name"></param>
32         /// <param name="loginName"></param>
33         /// <param name="age"></param>
34         /// <param name="address"></param>
35         /// <param name="password"></param>
36         public User(string name,string loginName,int age,string address="上海",string password="1234")
37         {
38             this.Name = name;
39             this.LoginName = loginName;
40             this.Age = age;
41             this.Address = address;
42             this.Password = password;
43         }
44     }
45 
46 使用默認值參數和命名參數
47  class Program
48     {
49         static void Main(string[] args)
50         {
51             //參數默認值:能夠給參數賦值也可使用參數默認值
52             //一、使用默認值
53             User user = new User("小明","xiaoming",27);
54             Console.WriteLine(user.Address);//輸出默認值:上海
55 
56             //二、給參數賦值
57             User user2 = new User("小紅", "xiaohong", 28,"北京");
58             Console.WriteLine(user2.Address);//輸出:北京
59 
60             //命名參數:使用默認值參數的時候,指定參數的名稱,命名參數要寫在全部固定參數的後面
61             //好處:適用於有多個默認值參數的狀況,根據命名參數,只修改須要修改的默認值
62             //使用命名參數只修改密碼
63             User user3 = new User("小紅", "xiaohong", 28,password:"5678");
64             Console.WriteLine(user3.Password);//輸出:5678
65 
66             Console.ReadKey();
67         }
68     }

輸出結果:

4、對象初始化器和集合初始化器

 1  class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5 
 6             //傳統的初始化對象的方式
 7             User zjl = new User();
 8             zjl.Name = "周杰倫";
 9             zjl.phone = "12345678956";
10 
11             //使用對象初始化器:{},使用對象初始化器,必須提供一個無參的構造函數,能夠只給部分屬性初始化
12             User xiaohong = new User()
13             {
14                 Name = "小紅",
15                 phone = "1232154566",
16                 Address = "上海"
17             };
18 
19             Console.WriteLine("姓名:"+xiaohong.Name);//輸出:小紅
20 
21             //集合初始化器
22             List<User> listUser = new List<User>()
23             {
24                 xiaohong,
25                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
26                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
27                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
28                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
29                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
30             };
31             Console.ReadKey();
32         }
33     }

 5、匿名類和匿名方法

 

匿名類型
有時候你定義的類只是用來封裝一些相關的數據,但並不須要相關聯的方法、事件和其餘自定義的功能。同時,這個類僅僅在當前的應用程序中使用,而不須要在項目間重用。你所須要的只是一個「臨時的」類型,如今來看看這個類的定義
internal class oneClass
{
   //定義若干私有數據成員
   //經過屬性來封裝每一個數據成員
}

構建上面的類雖說不上有多難,可是若是這個類有不少數據成員的話,那麼仍是要消耗至關時間的。C#3.0提供了匿名類型來輕鬆完成這個工做。
如今定義一個匿名對象來表示一我的
var aPeople=new {pName="張三",pAge=26,pSex="男"};
如今咱們就可使用屬性語法獲取和設置對象的各個變量
aPeople.pAge=29;
Console.WriteLine("{0} is {1}years old",aPeople.pName,aPeople.pAge);
匿名類型的嵌套
    剛剛咱們定義了表示一我的的匿名類型,如今咱們定義一個表示僱員的嵌套匿名類型:
    var Aemployee=new {
        JoinDate="2012-09-23",
        aPeople=new {pName="張三",pAge=26,pSex="男"},
        title=Manager
    };

匿名類型的限制:
一、匿名類型不支持事件、自定義方法和自定義重寫
二、匿名類型是隱式封閉的
三、匿名類型的實例建立只使用默認構造函數
四、匿名類型沒有提供可供控制的類名稱(使用var定義的)

匿名方法
普通方法定義方式,由於方法的存在是爲了複用一段代碼,因此通常會給方法取個名字,這個方法的引用就能夠經過「方法名」調用
匿名方法:
可是有的方法,不須要複用,僅僅是使用一次就夠了,因此不須要方法名,這種方法就叫作匿名方法。
匿名方法必須結合委託使用。(潛在的意思就是:儘管沒有方法名了,但方法的指針仍是存放了某個委託對象中)
注意:
一、在編譯後,會爲每一個匿名方法建立一個私有的靜態方法,而後將此靜態方法傳給委託對象使用
二、匿名方法編譯後會生成委託對象,生成方法,而後把方法裝入委託對象,最後賦值給聲明的委託變量
三、匿名方法能夠省略參數,編譯的時候會自動爲這個方法按照委託簽名的參數添加參數

 1   public class Test
 2     {
 3         public static void TestFive()
 4         {
 5             //匿名類型:只能使用一次,僅能在當前的項目中使用
 6             var aPeople = new { pName = "張三", pAge = 26, pAddress = "美國" };
 7             //嵌套匿名類型
 8             var aEmployee = new
 9             {
10                 JionDate = DateTime.Now,
11                 Salary = 8000,
12                 aPeople = new { pName = "張三", pAge = 26, pAddress = "美國" }
13             };
14 
15             Console.WriteLine(aEmployee.aPeople.pName);//輸出:張三
16 
17             Console.ReadKey();
18         }
19 
20         public static void Test()
21         {
22             //不能使用匿名類型aPeople,aPeople是局部
23             Console.WriteLine(aPeople.pName);//錯誤
24         }
25     }

匿名方法

 
 
 1 class Program
 2     {
 3         /// <summary>
 4         /// 聲明委託
 5         /// </summary>
 6         /// <param name="s"></param>
 7         delegate void Printer(string s);
 8         public delegate void PrintEmployee(User u);
 9 
10         static void Main(string[] args)
11         {
12             //匿名方法:必須結合委託使用
13             Printer p = delegate(string s)
14             {
15                 Console.WriteLine(s);
16             };
17             //使用匿名方法
18             p("Hello World");
19 
20             List<User> listUser = new List<User>()
21             {
22                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
23                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
24                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
25                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
26                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
27             };
28 
29             //匿名方法只使用一次
30             ChangeUserPwd(listUser, delegate(User u) {
31 
32                 Console.WriteLine(u.Name+"的新密碼是:"+u.Password);
33             });
34             //使用Lambda表達式
35             ChangeUserPwd(listUser, u=>
36             {
37                 Console.WriteLine(u.Name + "的新密碼是:" + u.Password);
38             });
39             Console.ReadKey();
40         }
41 
42         /// <summary>
43         /// 批量修改用戶的密碼並輸出修改之後的密碼
44         /// </summary>
45         /// <param name="list"></param>
46         /// <param name="callback"></param>
47         public static void ChangeUserPwd(List<User> list, PrintEmployee callback)
48         {
49             int i = 0;
50             foreach (User u in list)
51             {
52                 u.Password = u.Password + i.ToString();
53                 i += 2;
54                 callback(u);
55             }
56         }        
57     }

 

 

 6、擴展方法

爲何要有擴展方法,就是爲了在不修改源碼的狀況下,爲某個類增長新的方法。
語法:
定義靜態類,並添加public的靜態方法,第一個參數表明擴展方法的擴展類。它必須放在一個非嵌套、非泛型的靜態類中(的靜態方法);它至少有一個參數;第一個參數必須附加this關鍵字;第一個參數不能有任何其餘修飾符(out/ref).第一個參數不能是指針類型。
注意:
一、C#只支持擴展方法,不支持擴展屬性、擴展事件等;
二、方法名無限制,第一個參數必須帶this,表示要擴展的類型;
三、擴展方法的命名空間可使用namespace System,但不推薦;
四、定義擴展方法的類必須是靜態類;
五、擴展方法雖然是public的靜態方法,可是生成之後是實例方法,使用時須要先實例化對象,經過對象.方法名進行調用擴展方法;

 1 /// <summary>
 2     /// 靜態類:對Convert進行擴展,增長一個將string轉換成int的方法
 3     /// </summary>
 4     public static class ConvertExtension
 5     {
 6         /// <summary>
 7         /// 靜態方法:this 表示針對this後面的類型進行擴展
 8         /// </summary>
 9         /// <param name="s"></param>
10         /// <returns></returns>
11         public static int ConvertToInt(this Convert convert,string s)
12         {
13             int i;
14             if (int.TryParse(s, out i))
15             {
16                 return i;
17             }
18             else
19             {
20                 return 0;
21             }
22         }
23     }
24 
25 class Program
26     {
27         static void Main(string[] args)
28         {
29             //使用擴展方法:擴展方法雖然是public的靜態方法,可是生成之後是實例方法,使用時須要先實例化對象,經過對象.方法名進行調用擴展方法
30             //擴展方法所在命名空間和使用代碼的命名空間必須相同 擴展方法必須是靜態類
31             Convert convert = new Convert();
32             int i= convert.ConvertToInt("abc");
33 
34             Console.WriteLine(i);//輸出:0
35 
36             //方法2
37             int j= ConvertExtension.ConvertToInt(convert, "2");
38             Console.WriteLine(j);//輸出:2
39 
40             Console.ReadKey();
41         }
42     }

7、內置泛型委託

Action<T>
可使用Action<T>委託以參數形式傳遞方法,而不用顯示聲明自定義的委託。封裝的方法必須與此委託定義的方法簽名相對應,也就是說,封裝的方法必須具備一個經過值傳遞給它的參數,而且不能有返回值。
一般,這種方法用於執行某個操做。

 1 /// <summary>
 2     /// List擴展方法
 3     /// </summary>
 4     public static class ListExtend
 5     {
 6         //聲明自定義泛型委託
 7         public delegate void PrintT<T>(T t);
 8 
 9         public static void TEach<T>(this List<T> list, PrintT<T> pt)
10         {
11             foreach (T t in list)
12             {
13                 pt(t);
14             }
15         }
16     }
17 
18 
19 class Program
20     {
21         
22         static void Main(string[] args)
23         {
24             List<User> listUser = new List<User>()
25             {
26                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
27                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
28                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
29                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
30                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
31             };
32 
33             List<Dept> listDept = new List<Dept>()
34             {
35                 new Dept(){DeptId="0001",DeptName="人事部",PepNum=10},
36                  new Dept(){DeptId="0002",DeptName="財務部",PepNum=7},
37                   new Dept(){DeptId="0003",DeptName="行政部",PepNum=15}
38             };
39 
40 
41             #region 使用自定義委託
42             
43             //打印全部用戶信息
44             listUser.TEach(PrintUser);
45 
46             listDept.TEach(PrintDept); 
47             
48             #endregion
49 
50 
51             #region 使用內置泛型委託
52 
53             listUser.ForEach(PrintUser);
54             //使用匿名方法
55             listUser.ForEach(delegate(User u) { Console.WriteLine(u.Name + " " + u.Password + " " + u.phone); });
56 
57             //使用Lambda表達式
58             listUser.ForEach(p=>Console.WriteLine(p.Name+" "+p.Password+" "+p.phone));
59 
60             listDept.ForEach(new Action<Dept> (delegate(Dept d)
61             {
62                 Console.WriteLine(d.DeptId + " " + d.DeptName + " " + d.PepNum);
63             }));
64 
65             #endregion
66 
67             Console.ReadKey();
68         }
69 
70         /// <summary>
71         /// 打印一個用戶信息
72         /// </summary>
73         /// <param name="u"></param>
74         public static void PrintUser(User u)
75         {
76             Console.WriteLine(u.Name+" "+u.Password+" "+u.phone);
77         }
78 
79         /// <summary>
80         /// 打印一個部門信息
81         /// </summary>
82         /// <param name="d"></param>
83         public static void PrintDept(Dept d)
84         {
85             Console.WriteLine(d.DeptId+" "+d.DeptName+" "+d.PepNum);
86         }
87     }

Predicate<T>
表示定義一組條件並肯定指定對象是否符合這些條件的方法。
此委託由Array和List<T>類的幾種方法使用,用於在集合中搜索元素。返回值爲Bool類型

 1  public static class Extend
 2     {
 3         //自定義泛型委託
 4         public delegate bool CheckDelegate<T>(T t);
 5         public static List<T> MyFind<T>(this List<T> list, CheckDelegate<T> match)
 6         {
 7             List<T> newList = new List<T>();
 8             foreach (T item in list)
 9             {
10                 if (match(item))
11                 {
12                     newList.Add(item);
13                 }
14             }
15             return newList;
16         }
17     }
18 
19 
20 class Program
21     {
22         static void Main(string[] args)
23         {
24             List<User> listUser = new List<User>()
25             {
26                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
27                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
28                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
29                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
30                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
31             };
32 
33             List<Dept> listDept = new List<Dept>()
34             {
35                 new Dept(){DeptId="0001",DeptName="人事部",PepNum=10},
36                  new Dept(){DeptId="0002",DeptName="財務部",PepNum=7},
37                   new Dept(){DeptId="0003",DeptName="行政部",PepNum=15}
38             };
39             
40             //使用內置Predicate委託
41            List<User> newListUser=  listUser.FindAll(new Predicate<User>(delegate(User u){return u.Age>40;}));
42 
43             //使用自定義泛型委託
44            List<User> list = listUser.MyFind(Match);
45            foreach (User u in list)
46            {
47                Console.WriteLine(u.Name + " " + u.Password + " " + u.phone); 
48            }
49            Console.ReadKey();
50         }
51 
52         static bool Match(User u)
53         {
54             if (u.Age > 15)
55             {
56 
57                 return true;
58             }
59             return false;
60         }
61     }

Func 返回值類型能夠自定義

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<User> listUser = new List<User>()
 6             {
 7                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
 8                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
 9                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
10                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
11                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
12             };
13 
14             List<Dept> listDept = new List<Dept>()
15             {
16                 new Dept(){DeptId="0001",DeptName="人事部",PepNum=10},
17                  new Dept(){DeptId="0002",DeptName="財務部",PepNum=7},
18                   new Dept(){DeptId="0003",DeptName="行政部",PepNum=15}
19             };
20 
21             //能夠自定義Func返回值類型
22             List<int> newList= listUser.Select(new Func<User, int>(delegate(User u) { return u.Age; })).ToList();
23             List<int> list = listUser.Select(p => { return p.Age; }).ToList();
24             newList.ForEach(p => Console.WriteLine(p));
25 
26             //根據用戶信息獲得員工信息
27             List<Employee> listEmploy= listUser.Select(new Func<User, Employee>(delegate(User u)
28                 {
29                     Employee e = new Employee();
30                     if (u.Age > 15)
31                     {
32                         e.Name = u.Name;
33                         e.Phone = u.phone;
34                         e.Salary = 5000;
35                         return e;
36                     }
37                     else
38                     {
39                         return null;
40                     }
41 
42                     
43                 })).ToList();
44             listEmploy.ForEach(p =>
45             {
46                 if (p != null)
47                 {
48                     Console.WriteLine(p.Name+" "+p.Salary);
49                 }
50               
51             });
52 
53             Console.ReadKey();
54         }
55     }

8、Lambda表達式

Lambda表達式是比匿名方法更簡潔的一種匿名方法語法

最基本的Lambda表達式語法:
{參數列表}=>{方法體}
例如:
(int x)=>{returm x+1}
說明:
一、參數列表中的參數類型能夠是明確類型或推斷類型
二、若是是推斷類型,則參數的數據類型將由編譯器根據上下文自動推斷出來

若是參數列表只包含一個推斷類型參數時:
參數列表=>{方法體}
前提:x的數據類型能夠根據上下文推斷出來
 x =>{returm x+1}

若是方法體只包含一條語句時:
{參數列表}=>表達式
{int x} => x+1;

Lambda表達式示例:
一、多參數,推斷類型參數列表,表達式方法體
(x,y) => x*y
二、無參數,表達式方法體
() => Console.WriteLine()
三、多參數,推斷類型參數列表,多語句方法體,須要使用{}
(x,y) => {Console.WriteLine(x);Console.WriteLine(y)}

Lambda表達式縮寫推演
new Func<string,int>(delegate(string str){return str.Length;});//內置委託
delegate(string str){return str.Length;}//匿名方法
(string str)=>{return str.Length};//Lambda表達式
(str)=>str.Length;//讓編譯器推斷類型
str=>str>Length;//去掉沒必要要的括弧

 1   #region Lambda表達式
 2 
 3             //標準語法
 4             MyDelegate my1 = (string name) => { return "Lambda表達式:hello" + name; };
 5             Console.WriteLine(my1("tom"));
 6 
 7             //或者(僅有一個參數) 參數列表只包含一個推斷類型參數
 8             MyDelegate my2 = name => { return "Lambda表達式:hello" + name; };
 9             Console.WriteLine(my2("tom"));
10 
11             //或者(方法體只有一條語句)
12             MyDelegate my3 = name => "Lambda表達式:hello" + name;
13             Console.WriteLine(my3("tom"));
14 
15             #endregion

9、標準查詢運算符

標準查詢運算符:定義在System.Linq.Enumerable類中的50多個爲IEnumerable<T>準備的擴展方法,這些方法用來對它操做的集合進行查詢篩選。
篩選集合where:須要提供一個帶bool返回值的「篩選器」,從而標明集合中某個元素是否應該被返回。
查詢投射:返回新對象集合IEnumerable<TSource> Select()
統計數量int Count()
多條件排序 OrderBy().ThenBy().ThenBy()
集合鏈接 Join()

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<User> listUser = new List<User>()
 6             {
 7                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
 8                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
 9                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
10                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
11                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
12             };
13 
14             List<Dept> listDept = new List<Dept>()
15             {
16                 new Dept(){DeptId="0001",DeptName="人事部",PageNum=10},
17                 new Dept(){DeptId="0002",DeptName="財務部",PageNum=10},
18                 new Dept(){DeptId="0003",DeptName="行政部",PageNum=10}
19             };
20 
21             //1.where
22             List<User> newListUser = listUser.Where(p => p.Age>12).ToList();
23             Console.WriteLine("全部用戶姓名");
24             listUser.ForEach(p=>Console.WriteLine(p.Name));
25             Console.WriteLine("年齡大於12的用戶姓名");
26             newListUser.ForEach(p=>Console.WriteLine(p.Name));
27 
28             //2.order by 排序  多條件排序:先按照年齡降序排序,在安排phone降序排序,最後按照LoginName升序排序
29             List<User> list1 = listUser.OrderByDescending(p => p.Age).ThenByDescending(p => p.phone).ThenBy(p => p.LoginName).ToList();
30 
31             //3.join:鏈接查詢
32             //返回值是非匿名類:返回值是UserDept類型
33             List<UserDept> uds = listUser.Join(listDept, u => u.DeptId, d => d.DeptId,
34                  (u, d) => new UserDept() { UserName = u.Name, LoginName = u.LoginName, DeptName = d.DeptName }).ToList();
35             //循環輸出
36             uds.ForEach(p=>Console.WriteLine(p.UserName));
37 
38             //返回值是匿名類:用var推斷類型接收返回值
39             var udVar = listUser.Join(listDept, u => u.DeptId, d => d.DeptId,
40                  (u, d) => new { UserName = u.Name, LoginName = u.LoginName, DeptName = d.DeptName }).ToList();
41             //循環輸出
42             udVar.ForEach(p => Console.WriteLine(p.UserName));
43 
44             #region 4.0 group by 分組
45 
46             //4.1 按照集合中的用戶的部門編號進行分組
47             IEnumerable<IGrouping<string, User>> userGroup = listUser.GroupBy(p => p.DeptId);
48 
49             foreach (IGrouping<string, User> group in userGroup)
50             {
51                 Console.WriteLine("部門編號:" + group.Key);
52                 foreach (User user in group)
53                 {
54                     Console.WriteLine(user.Name + "-" + user.phone + "-" + user.LoginName);
55                 }
56 
57                 Console.WriteLine("--------------------------------");
58             }
59             #endregion
60 
61             #region 5.0 分頁:Skip+Take  Skip:跳過 Take:取
62             
63             //分頁前提:數據源按照必定的列進行排序
64             List<User> listSource = listUser.OrderBy(p => p.Name).ToList();
65             foreach (User user in listSource)
66             {
67                 Console.WriteLine(user.Name);
68             }
69 
70             Console.WriteLine("--------------");
71             //取第一頁數據,每頁顯示2條數據
72             List<User> list = GetPageListByIndex(listUser, 1, 2);
73             //輸出分頁結果
74             foreach (User user in list)
75             {
76                 Console.WriteLine(user.Name);
77             }
78 
79             #endregion
80 
81             Console.ReadKey();
82         }
83 
84         /// <summary>
85         /// 根據頁碼提取當頁數據
86         /// </summary>
87         /// <param name="listSource">要分頁的數據</param>
88         /// <param name="pageIndex">頁碼</param>
89         /// <param name="pageSize">每頁要顯示的條數</param>
90         /// <returns></returns>
91         static List<User> GetPageListByIndex(List<User> listSource, int pageIndex, int pageSize)
92         {
93             return listSource.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
94         }
95     }

10、Linq

Linq:語言集成查詢
Linq是一組語言特性和API,使得你可使用統一的方式編寫各類查詢。查詢的對象包括XML、對象集合、SQL Server數據庫等等。
Linq to Objects:主要負責對象的查詢
Linq to XML:主要負責XML的查詢
Linq to ADO.NET:主要負責數據庫的查詢
  Linq to SQL
  Linq to DataSet
  Linq to Entities

 

Linq查詢的兩種方式:
一、查詢方法方式:主要利用System.Linq.Enumerable類中定義的擴展方法和Lambda表達式進行查詢
二、查詢語句方式:一種更接近SQL語法的查詢方式

查詢語句VS查詢方法
一、CLR自己並不理解查詢語句,它只理解查詢方法
二、編譯器負責在編譯時將查詢語句翻譯成查詢方法
三、大部分查詢方法都有對應的查詢語句形式:Select()對應select、OrderBy()對應orderby
四、部分查詢方法目前在C#中尚未對應的查詢語句,如:Count()和Max()這時只能採用如下替代方案:
   查詢方法
   查詢語句+查詢方法的混合方式

  1  class Program
  2     {
  3         //聲明委託
  4         public delegate string MyDelegate(string name);
  5 
  6         static void Main(string[] args)
  7         {
  8             //建立int類型數組,查找其中的偶數並降序排序輸出
  9             int[] arrays = { 5, 2, 0, 66, 4, 32, 7, 1 };
 10 
 11             #region  使用循環實現
 12 
 13             List<int> list = new List<int>();
 14             foreach (int i in arrays)
 15             {
 16                 if (i % 2 == 0)
 17                 {
 18                     list.Add(i);
 19                 }
 20             }
 21             //排序
 22             list.Sort();
 23             //反轉
 24             list.Reverse();
 25 
 26             Console.WriteLine(string.Join(",", list));
 27 
 28 
 29             #endregion
 30 
 31             #region 使用Linq實現
 32             //查詢方法方式
 33             var intNew = arrays.Where(p => p % 2 == 0)
 34                 .Select(p => p)
 35                 .OrderByDescending(p => p).ToList();
 36 
 37             Console.WriteLine(string.Join(",", intNew));
 38 
 39             //查詢語句方式
 40             var even = from number in arrays
 41                        where number % 2 == 0
 42                        orderby number descending
 43                        select number;
 44             #endregion
 45 
 46             //Linq新特性
 47 
 48             #region 類型推斷
 49             //類型推斷  注意:不要亂用,僅用在Linq中
 50             var b = true;
 51             if (b)
 52             {
 53                 Console.WriteLine("True");
 54             }
 55             #endregion
 56 
 57             #region 擴展方法
 58             //擴展方法 擴展方法所在命名空間和使用代碼的命名空間必須相同 擴展方法必須是靜態類
 59             string s = "abc";
 60             int a = s.ToInt();//方法圖標有一個向下的箭頭,表示是擴展方法
 61             Console.WriteLine(a);
 62 
 63             object obj = "sdsf";
 64            double d=  obj.ToDouble();
 65 
 66            Console.WriteLine(d);
 67             #endregion
 68           
 69 
 70             #region 對象初始化器
 71             //集合初始化器
 72             Contact con = new Contact() 
 73            {FirstName="Tom",LastName="Jerry",Email="tom@163.com" };
 74 
 75             Console.WriteLine(con.Email);
 76             #endregion
 77 
 78             #region 集合初始化器
 79 
 80             List<Contact> listContact = new List<Contact>() 
 81             {
 82               new Contact(){FirstName="Tom",LastName="Tack",Email="aaa"},
 83               new Contact(){FirstName="Tom",LastName="jerry",Email="bbb"}
 84             };
 85 
 86             Console.WriteLine(listContact[0].Email);
 87             #endregion
 88 
 89             #region 匿名類型
 90 
 91             var item = new {ProductName="Iphone",Price=4000 };
 92             string info = item.ProductName + "..." + item.Price;
 93             Console.WriteLine(info);
 94 
 95             #endregion
 96 
 97             //定義委託類型的變量
 98             MyDelegate my = new MyDelegate(Hello);//MyDelegate my=Hello
 99             //調用委託
100             string strName = my("tom");
101             Console.WriteLine(strName);
102 
103 
104             #region 匿名方法(只用一次)
105             MyDelegate my2 = delegate(string str)
106             {
107                 return "匿名方法:hello" + str;
108             };
109 
110             //調用
111             string name= my2("tom");
112             Console.WriteLine(name);
113             #endregion
114 
115             #region Lambda表達式
116 
117             //標準語法
118             MyDelegate my1 = (string str) => { return "Lambda表達式:hello" + str; };
119             Console.WriteLine(my1("tom"));
120 
121             //或者(僅有一個參數) 參數列表只包含一個推斷類型參數
122             MyDelegate myDel = p => { return "Lambda表達式:hello" + p; };
123             Console.WriteLine(my2("tom"));
124 
125             //或者(方法體只有一條語句)
126             MyDelegate my3 = p => "Lambda表達式:hello" + p;
127             Console.WriteLine(my3("tom"));
128 
129             #endregion
130 
131             //Linq
132             //兩種查詢方式
133             //Select
134             int[] intArray = { 1,2,3,6,4,90,65,44,9};
135 
136             //一、查詢方法方式 p:指的是intArray數組中的每個元素
137             var var1 = intArray.Select(p => p + 1);
138             Console.WriteLine(string.Join(",", var1));
139 
140             //二、查詢語句方式
141             var var2 = from p in intArray select p + 1;
142             Console.WriteLine(string.Join(",", var1));
143             
144             
145             //where
146             //查詢方法
147             var var3 = intArray.Where(p => p % 2 == 0);//選擇數組中的偶數
148             //查詢語句(通常以select結尾)
149             var3 = from number in intArray
150                    where number % 2 == 0
151                    select number;
152             
153             //多個條件(刷選出數組中大於10的偶數)
154             //查詢方法1
155             var3 = intArray.Where(p => p % 2 == 0 && p > 10);
156             //查詢方法2:使用自定義謂語條件查詢
157             var3 = intArray.Where(p => GetCondition(p));
158 
159             //查詢語句1
160             var3 = from number in intArray
161                    where number % 2 == 0 && number > 10
162                    select number;
163             //查詢語句2
164             var3 = from number in intArray
165                    where GetCondition(number)
166                    select number;
167             Console.WriteLine(string.Join(",", var3));
168 
169 
170             //創建一個Contact類型的集合,查找FirstName="tom" && email=""的聯繫人的LastName,使用4種方式查詢
171             List<Contact> MyContact = new List<Contact>() 
172             {
173               new Contact(){FirstName="tom",LastName="jorry",Email="Tom@163.com"},
174               new Contact(){FirstName="tom",LastName="jack",Email="jack@163.com"},
175               new Contact(){FirstName="tom",LastName="jerry",Email="jerry@163.com"}
176             };
177 
178             //查詢方法
179             var var4 = MyContact.Where(p => p.FirstName == "tom" && p.Email == "Tom@163.com");
180             var4 = MyContact.Where(p => GetContact(p));
181 
182             //查詢語句
183             var4 = from p in MyContact where p.FirstName == "tom" && p.Email == "Tom@163.com" select p;
184             var4 = from p in MyContact where GetContact(p) select p;
185             foreach(Contact contact in var4)
186             {
187                 Console.WriteLine(contact.LastName);
188             }
189 
190             //刪除重複元素,沒有對應的查詢語句
191             int[] ints = { 1,1,2,3,4,0};
192             var var5 = ints.Distinct();
193             Console.WriteLine(string.Join(",",var5));
194 
195             //排序
196             int[] intArrays = { 1,2,4,3,7,8,0};
197             var var6 = intArrays.OrderBy(i => i);
198             var6 = intArrays.OrderByDescending(i => i);
199             //級聯調用
200             var6 = intArrays.Where(i => i % 2 == 0).OrderBy(i => i);
201             var6 = from i in intArrays where i % 2 == 0 
202                    orderby i select i;//正序排序
203             var6 = from i in intArrays where i % 2 == 0 
204                    orderby i descending select i;//倒序排序
205             //查詢方法+查詢語句,混合使用
206             var6 = (from i in intArrays where i % 2 == 0 select i).OrderBy(i => i);
207             Console.WriteLine(string.Join(",", var6));
208 
209             //複雜查詢
210             List<Employee> listEmployee = new List<Employee>() 
211             {
212                new Employee(){
213                    FirstName="唐僧",
214                    LastName="玄奘",
215                    Sex="",
216                    Age=30,   
217                    Country="大唐"
218                },
219                 new Employee(){
220                    FirstName="白骨精",
221                    LastName="晶晶",
222                    Sex="",
223                    Age=200,   
224                    Country="古墓"
225                },
226                 new Employee(){
227                    FirstName="孫悟空",
228                    LastName="行者",
229                    Sex="",
230                    Age=500,   
231                    Country="傲來國"
232                },
233                 new Employee(){
234                    FirstName="紫霞",
235                    LastName="仙子",
236                    Sex="",
237                    Age=100,   
238                    Country="天界"
239                }              
240             };
241 
242             //分組,按照性別分組
243             var var7 = from p in listEmployee group p by p.Sex;
244             var7 = listEmployee.GroupBy(p => p.Sex);
245             foreach (var group in var7)
246             {
247                 Console.WriteLine("分組:"+group.Key);
248                 foreach (var v in group)
249                 {
250                     Console.WriteLine(v.FirstName);
251                 }
252             }
253             Console.ReadKey();
254         }
255 
256         static bool GetContact(Contact item)
257         {
258             if (item.FirstName == "tom" && item.Email == "Tom@163.com")
259                 return true;
260             else
261                 return false;
262         }
263 
264         static bool GetCondition(int i)
265         {
266             if (i % 2 == 0 && i > 10)
267                 return true;
268             else
269                 return false;
270         }
271 
272         static string Hello(string name)
273         {
274             return "hello" + name;
275         }
276     }

查詢語句

 1 class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             List<User> listUser = new List<User>()
 6             {
 7                 new User(){Name="張三",Password="1234",Age=12,DeptId="0001"},
 8                 new User(){Name="張四",Password="1234",Age=16,DeptId="0002"},
 9                 new User(){Name="張五",Password="1234",Age=29,DeptId="0003"},
10                 new User(){Name="張六",Password="1234",Age=18,DeptId="0001"},
11                 new User(){Name="張七",Password="1234",Age=12,DeptId="0001"}
12             };
13 
14               List<Dept> listDept = new List<Dept>()
15             {
16                 new Dept(){DeptId="0001",DeptName="人事部",PageNum=10},
17                 new Dept(){DeptId="0002",DeptName="財務部",PageNum=10},
18                 new Dept(){DeptId="0003",DeptName="行政部",PageNum=10}
19             };
20 
21             //一、從老集合中查詢每個元素存放到新集合
22             var newList = from p in listUser select p;
23 
24             //二、帶where條件
25             var list = from p in listUser where p.Age > 12 && p.Address == "上海" select p;
26 
27             //三、OrderBy排序:按照姓名、年齡升序排序
28             var newListUser = from p in listUser orderby p.Name orderby p.Age ascending  select p;
29 
30             //四、Join
31             var joinResult = from u in listUser
32                              join d in listDept
33                              on u.DeptId equals d.DeptId
34                              select new {UserName = u.Name, LoginName = u.LoginName, DeptName = d.DeptName  };
35             //遍歷
36             foreach (var item in joinResult)
37             {
38                 Console.WriteLine(item.DeptName);
39             }
40 
41             //五、 group by 分組查詢
42             var groupList = from u in listUser group u by u.DeptId;
43             //遍歷
44             foreach (var group in groupList)
45             {
46                 Console.WriteLine(group.Key);
47                 foreach (var item in group)
48                 {
49                     Console.WriteLine(item.ToString());
50                 }
51             }
52 
53             Console.ReadKey();
54         }
55     }
相關文章
相關標籤/搜索