1.C#基础语法
1.1 泛型
泛型是 C# 推出的一个重要语法,泛型允许在编写方法或类是定义一些未确定的类型参数。它提供了类型安全且高效的数据结构和算法,同时也可以避免装箱和拆箱操作,提高代码的复用性(编程时,出现相似的模块,这加大我们的工作量,如果使用泛型可以让多个类型共享一组代码)。
定义一个简单的泛型类定义和使用的例子:
MyGenericClass<T>
是一个泛型类,其中的类型 T
是一个类型参数。
在 Main
方法中,我们创建了两个 MyGenericClass
的实例,一个用于 int
类型,另一个用于 string
类型。这展示了泛型的一个常见用法,即用于不同数据类型的通用数据结构。
using System;
using System.Collections.Generic;// 定义一个泛型类
public class MyGenericClass<T>
{private T _value;public MyGenericClass(T value){_value = value;}public void DisplayValue(){Console.WriteLine(_value.ToString());}
}class Program
{static void Main(){// 创建一个泛型类的实例,指定泛型类型参数为intMyGenericClass<int> intClass = new MyGenericClass<int>(10);intClass.DisplayValue(); // 输出: 10// 创建一个泛型类的实例,指定泛型类型参数为stringMyGenericClass<string> stringClass = new MyGenericClass<string>("Hello World");stringClass.DisplayValue(); // 输出: Hello WorldConsole.ReadKey();}
}
1.2 LinQ
LinQ是C#和VB中的统一查询语法,使用对象来保存和检索来自不同来源(如数据库、xml、对象集合)的数据。
主要功能:消除了编程语言和数据库之间的不匹配,以及为不同类型的数据源提供统一的查询接口。
适用范围:LInq适用于实现了IEnumerable <T>(IQueryable继承于IEnumerable )的实例,如:List,Dictionary,Queue,LinkedList,Array等。
linq的使用
有两种方法可以将LINQ查询写入IEnumerable集合或IQueryable数据源。
1、查询语法
特点:以from子句开头,可以以select或groupBy子句结束
2、lambda表达式(简洁且功能更多,推荐)
下边给出了简单的例子,注:后边的部分都是使用的这个测试数据。
//准备的测试数据IList<UserInfo> userList = new List<UserInfo>() { new UserInfo() { UId = 1, UserName = "zs", Age = 23 ,RoleId=1} , new UserInfo() { UId = 2, UserName = "ls", Age = 20 ,RoleId=2}, new UserInfo() { UId = 3, UserName = "ww", Age = 33 ,RoleId=1}, new UserInfo() { UId = 4, UserName = "zl", Age = 26 ,RoleId=2}, new UserInfo() { UId = 5, UserName = "tq", Age = 42 ,RoleId=2} };//用户列表 IList<RoleInfo> roleList = new List<RoleInfo>(){ new RoleInfo(){Rid=1,RoleName="管理员"}, new RoleInfo(){Rid=2,RoleName="普通用户"}, };//角色列表//query语法 var resUsers = from u in userList where u.Age > 20 select new {u.UId,u.UserName,u.Age};//lambdavar resUsers2 = userList.Where<UserInfo>(u => u.Age > 20).Select(u => new { u.UId,u.UserName,u.Age});
linq详解
1、过滤 (where 和 oftype)
Where:根据给定的条件表达式过滤集合,并返回一个新集合
OfType:根据类型进行过滤
IList<object> list = new List<object>() { 1, "hello", user };//user是一个UserInfo的实例//query语法var result = from o in list.OfType<string>() select o;//lambda语法var result2 = list.OfType<string>();
2、排序(OrderBy,OrderByDescending,ThenBy,ThenByDescending)
//对userList先按Id排序,再按Age排序//query语法 var result = from u in userList orderby u.Id,u.Age descending select u;//lambda语法var result2 = userList.OrderByDescending(u => u.Id).ThenBy(u=>u.Age);
3、分组(group by,ToLookUp)
//query语法 var resGroups = from u in userList group u by u.RoleId;//lambda方式 注:GroupBy延迟执行,而ToLookup是立即执行的,使用方法和GroupBy一样。var resGroups2 = userList.GroupBy(u => u.RoleId);//遍历(group.Key为设置分组的列的值) foreach (var group in resGroups) { Console.WriteLine("roleId:{0}", group.Key); foreach (UserInfo user in group) { Console.WriteLine("UserName:{0}", user.UserName); } } /*结果: roleId:1 UserName:zs UserName:ww roleId:2 UserName:ls UserName:zl 21 UserName:tq */
//多列分组 var productGroup= from p in db.Products group p by new { p.PName, p.PColor } into g select new { g.Key,//这里的key是一个对象,有两个属性:PName,PColor g };
4、连接查询(join)
//query语法,查询用户名和该用户所属的角色 inner joinvar resJoin = from user in userList join role in roleList on user.RoleId equals role.Rid select new { uname=user.UserName, rname=role.RoleName };//left join,right join调整下顺序即可var resJoin = from user in userList join role in roleList on user.RoleId equals role.Rid into temp from tt in temp.DefaultIfEmpty select new { uname=user.UserName, rname=role?.RoleName };//cross joinvar resJoin = from user in userList from role in roleList select new { uname=user?.UserName, rname=role?.RoleName };//lambda方式var resJoin2 = userList.Join(roleList, user => user.RoleId, //outkey role => role.Rid, //innerkey (user, role) => new //result { uname = user.UserName, rname = role.RoleName });//遍历foreach (var item in resJoin2){ Console.WriteLine("用户:{0}----角色:{1}", item.uname, item.rname);} /*结果: 用户:zs----角色:管理员 用户:ls----角色:普通用户 用户:ww----角色:管理员 用户:zl----角色:普通用户 用户:tq----角色:普通用户 */