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