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()
{
// 创建一个泛型类的实例,指定泛型类型参数为int
MyGenericClass<int> intClass = new MyGenericClass<int>(10);
intClass.DisplayValue(); // 输出: 10
// 创建一个泛型类的实例,指定泛型类型参数为string
MyGenericClass<string> stringClass = new MyGenericClass<string>("Hello World");
stringClass.DisplayValue(); // 输出: Hello World
Console.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};
//lambda
var 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 join
var 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 join
var 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----角色:普通用户 */
标签:UserName,C#,Age,笔记,语法,泛型,user,var,new
From: https://blog.csdn.net/nmmking/article/details/137547537