365玩球平台-365bet规则-365体育网站忽然打不开了

C#十种语法糖

C#十种语法糖

语法糖

指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。需要声明的是“语法糖”这个词绝非贬义词,它可以给我们带来方便,是一种便捷的写法,编译器会帮我们做转换,而且可以提高开发编码的效率,在性能上也不会带来损失。

一、自动属性

以前:手写私有变量+公有属性现在:声明空属性,编译器自动生成对应私有成员字段。

写法:输入prop ,连续按两次tab键,自动生成属性。

1 ///

2 /// 自动属性

3 ///

4 public string Name { get; set; }

5

6 ///

7 /// 传统属性写法

8 ///

9 private string _LoginName;

10

11 public string LoginName

12 {

13 get { return _LoginName; }

14 set { _LoginName = value; }

15 }

二、隐式类型(var)

var定义变量有以下四个特点:程序员在声明变量时可以不指定类型,由编译器根据值来指定类型1、必须在定义时初始化2、一旦初始化完成,就不能再给变量赋与初始值不同类型的值了3、var要求是局部变量4、使用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;

三、参数默认值和命名参数

C#方法的可选参数是.net 4.0最新提出的新的功能,对应简单的重载可以使用可选参数和命名参数混合的形式来定义方法,这样就可以很高效的提高代码的运行效率 设计一个方法的参数时,可以部分或全部参数分配默认值。调用其方法时,可以重新指定分配了默认值的参数,也可以使用默认值。重新指定分配默认值的参数时,可以显式地为指定参数名称赋值;隐式指定的时候,是根据方法参数的顺序,靠C#编译器的推断。

使用的指导原则:1、可以为方法和有参属性指定默认值2、有默认值的参数,必须定义在没有默认值的参数之后3、默认参数必须是常量4、ref和out参数不能指定默认值

1 public class User

2 {

3 ///

4 /// 自动属性

5 ///

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 ///

29 /// 默认参数

30 ///

31 ///

32 ///

33 ///

34 ///

35 ///

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 //1、使用默认值

53 User user = new User("小明","xiaoming",27);

54 Console.WriteLine(user.Address);//输出默认值:上海

55

56 //2、给参数赋值

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 }

输出结果:

四、对象初始化器和集合初始化器

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 listUser = new List()

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 }

五、匿名类和匿名方法

匿名类型有时候你定义的类只是用来封装一些相关的数据,但并不需要相关联的方法、事件和其他自定义的功能。同时,这个类仅仅在当前的应用程序中使用,而不需要在项目间重用。你所需要的只是一个“临时的”类型,现在来看看这个类的定义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 };

匿名类型的限制:1、匿名类型不支持事件、自定义方法和自定义重写2、匿名类型是隐式封闭的3、匿名类型的实例创建只使用默认构造函数4、匿名类型没有提供可供控制的类名称(使用var定义的)

匿名方法普通方法定义方式,因为方法的存在是为了复用一段代码,所以一般会给方法取个名字,这个方法的引用就可以通过“方法名”调用匿名方法:但是有的方法,不需要复用,仅仅是使用一次就够了,所以不需要方法名,这种方法就叫做匿名方法。匿名方法必须结合委托使用。(潜在的意思就是:尽管没有方法名了,但方法的指针还是存放了某个委托对象中)注意:1、在编译后,会为每个匿名方法创建一个私有的静态方法,然后将此静态方法传给委托对象使用2、匿名方法编译后会生成委托对象,生成方法,然后把方法装入委托对象,最后赋值给声明的委托变量3、匿名方法可以省略参数,编译的时候会自动为这个方法按照委托签名的参数添加参数

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 ///

4 /// 声明委托

5 ///

6 ///

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 listUser = new List()

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 ///

43 /// 批量修改用户的密码并输出修改以后的密码

44 ///

45 ///

46 ///

47 public static void ChangeUserPwd(List 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 }

六、扩展方法

为什么要有扩展方法,就是为了在不修改源码的情况下,为某个类增加新的方法。语法:定义静态类,并添加public的静态方法,第一个参数代表扩展方法的扩展类。它必须放在一个非嵌套、非泛型的静态类中(的静态方法);它至少有一个参数;第一个参数必须附加this关键字;第一个参数不能有任何其他修饰符(out/ref).第一个参数不能是指针类型。注意:1、C#只支持扩展方法,不支持扩展属性、扩展事件等;2、方法名无限制,第一个参数必须带this,表示要扩展的类型;3、扩展方法的命名空间可以使用namespace System,但不推荐;4、定义扩展方法的类必须是静态类;5、扩展方法虽然是public的静态方法,但是生成以后是实例方法,使用时需要先实例化对象,通过对象.方法名进行调用扩展方法;

1 ///

2 /// 静态类:对Convert进行扩展,增加一个将string转换成int的方法

3 ///

4 public static class ConvertExtension

5 {

6 ///

7 /// 静态方法:this 表示针对this后面的类型进行扩展

8 ///

9 ///

10 ///

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 }

七、内置泛型委托

Action可以使用Action委托以参数形式传递方法,而不用显示声明自定义的委托。封装的方法必须与此委托定义的方法签名相对应,也就是说,封装的方法必须具有一个通过值传递给它的参数,并且不能有返回值。通常,这种方法用于执行某个操作。

1 ///

2 /// List扩展方法

3 ///

4 public static class ListExtend

5 {

6 //声明自定义泛型委托

7 public delegate void PrintT(T t);

8

9 public static void TEach(this List list, PrintT 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 listUser = new List()

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 listDept = new List()

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 (delegate(Dept d)

61 {

62 Console.WriteLine(d.DeptId + " " + d.DeptName + " " + d.PepNum);

63 }));

64

65 #endregion

66

67 Console.ReadKey();

68 }

69

70 ///

71 /// 打印一个用户信息

72 ///

73 ///

74 public static void PrintUser(User u)

75 {

76 Console.WriteLine(u.Name+" "+u.Password+" "+u.phone);

77 }

78

79 ///

80 /// 打印一个部门信息

81 ///

82 ///

83 public static void PrintDept(Dept d)

84 {

85 Console.WriteLine(d.DeptId+" "+d.DeptName+" "+d.PepNum);

86 }

87 }

Predicate表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。返回值为Bool类型

1 public static class Extend

2 {

3 //自定义泛型委托

4 public delegate bool CheckDelegate(T t);

5 public static List MyFind(this List list, CheckDelegate match)

6 {

7 List newList = new List();

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 listUser = new List()

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 listDept = new List()

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 newListUser= listUser.FindAll(new Predicate(delegate(User u){return u.Age>40;}));

42

43 //使用自定义泛型委托

44 List 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 listUser = new List()

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 listDept = new List()

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 newList= listUser.Select(new Func(delegate(User u) { return u.Age; })).ToList();

23 List list = listUser.Select(p => { return p.Age; }).ToList();

24 newList.ForEach(p => Console.WriteLine(p));

25

26 //根据用户信息得到员工信息

27 List listEmploy= listUser.Select(new Func(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 }

八、Lambda表达式

Lambda表达式是比匿名方法更简洁的一种匿名方法语法

最基本的Lambda表达式语法:{参数列表}=>{方法体}例如:(int x)=>{returm x+1}说明:1、参数列表中的参数类型可以是明确类型或推断类型2、如果是推断类型,则参数的数据类型将由编译器根据上下文自动推断出来

如果参数列表只包含一个推断类型参数时:参数列表=>{方法体}前提:x的数据类型可以根据上下文推断出来 x =>{returm x+1}

如果方法体只包含一条语句时:{参数列表}=>表达式{int x} => x+1;

Lambda表达式示例:1、多参数,推断类型参数列表,表达式方法体(x,y) => x*y2、无参数,表达式方法体() => Console.WriteLine()3、多参数,推断类型参数列表,多语句方法体,需要使用{}(x,y) => {Console.WriteLine(x);Console.WriteLine(y)}

Lambda表达式缩写推演new Func(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

九、标准查询运算符

标准查询运算符:定义在System.Linq.Enumerable类中的50多个为IEnumerable准备的扩展方法,这些方法用来对它操作的集合进行查询筛选。筛选集合where:需要提供一个带bool返回值的“筛选器”,从而标明集合中某个元素是否应该被返回。查询投射:返回新对象集合IEnumerable Select()统计数量int Count()多条件排序 OrderBy().ThenBy().ThenBy()集合连接 Join()

1 class Program

2 {

3 static void Main(string[] args)

4 {

5 List listUser = new List()

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 listDept = new List()

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 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 list1 = listUser.OrderByDescending(p => p.Age).ThenByDescending(p => p.phone).ThenBy(p => p.LoginName).ToList();

30

31 //3.join:连接查询

32 //返回值是非匿名类:返回值是UserDept类型

33 List 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> userGroup = listUser.GroupBy(p => p.DeptId);

48

49 foreach (IGrouping 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 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 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 ///

85 /// 根据页码提取当页数据

86 ///

87 /// 要分页的数据

88 /// 页码

89 /// 每页要显示的条数

90 ///

91 static List GetPageListByIndex(List listSource, int pageIndex, int pageSize)

92 {

93 return listSource.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();

94 }

95 }

十、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查询的两种方式:1、查询方法方式:主要利用System.Linq.Enumerable类中定义的扩展方法和Lambda表达式进行查询2、查询语句方式:一种更接近SQL语法的查询方式

查询语句VS查询方法1、CLR本身并不理解查询语句,它只理解查询方法2、编译器负责在编译时将查询语句翻译成查询方法3、大部分查询方法都有对应的查询语句形式:Select()对应select、OrderBy()对应orderby4、部分查询方法目前在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 list = new List();

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 listContact = new List()

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 //1、查询方法方式 p:指的是intArray数组中的每一个元素

137 var var1 = intArray.Select(p => p + 1);

138 Console.WriteLine(string.Join(",", var1));

139

140 //2、查询语句方式

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 MyContact = new List()

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 listEmployee = new List()

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 listUser = new List()

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 listDept = new List()

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、从老集合中查询每一个元素存放到新集合

22 var newList = from p in listUser select p;

23

24 //2、带where条件

25 var list = from p in listUser where p.Age > 12 && p.Address == "上海" select p;

26

27 //3、OrderBy排序:按照姓名、年龄升序排序

28 var newListUser = from p in listUser orderby p.Name orderby p.Age ascending select p;

29

30 //4、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 //5、 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 }

相关推荐
世界第二的洞穴潜水点,塞班岛蓝洞
365bet规则

世界第二的洞穴潜水点,塞班岛蓝洞

📅 07-11 🔥 856
加盟+經銷 - Wine Passions 意酒會
365玩球平台

加盟+經銷 - Wine Passions 意酒會

📅 07-09 🔥 859
特写:梅西战“魔笛”
365玩球平台

特写:梅西战“魔笛”

📅 07-03 🔥 188
龟头的敏感点是哪里
365体育网站忽然打不开了

龟头的敏感点是哪里

📅 06-29 🔥 655
宜搜小说最新版本v5.8.7官方安卓版
365bet规则

宜搜小说最新版本v5.8.7官方安卓版

📅 07-01 🔥 696
无工厂 不生态!价格屠夫风行连发四款4K电视新品
365体育网站忽然打不开了

无工厂 不生态!价格屠夫风行连发四款4K电视新品

📅 07-18 🔥 595