lambda
lambda 声明运算符 => 从其主体中分离 lambda 参数列表。 若要创建 Lambda 表达式,需要在 Lambda 运算符左侧指定输入参数(如果有),然后在另一侧输入表达式或语句块。
通过Lambda表达式的方式创建Func和Action
Action<string, int> action = (string name, int age) =>
{
Console.WriteLine($"lambda 无返回值方法 参数为{
name}---{
age}");
};
action.Invoke("dsgs", 56);
Func<string, int, string> func1 = (name, age) =>
{
return $"lamdba 有返回值方法 参数为{
name}----{
age}";
};
var resu = func1.Invoke("过热时", 55);
Console.WriteLine(resu);
//在lambda中一个参数情况下,()可以省略
Func<string, bool> func2 = des =>
{
return true;
};
委托绑定方法
{
Action action1 = Demo1;
action1.Invoke();
Func<string, int, string> func3 = Demo;
var result = func3.Invoke("非但不能", 88);
Console.WriteLine(result);
}
public static void Demo1()
{
Console.WriteLine("调用方法一");
}
public static string Demo(string name,int age)
{
return $"调用===》Demo方法 参数为{
name}==={
age}";
}
Linq
Linq是一种对集合、数据源的集成式查询方式,它是对IEnumerable的扩展方法集,所以想要使用Linq的话,需要引用两个命名空间 System.Linq和System.Linq.Expressions
Linq查询是一种延迟查询,当返回类型是一个IEnumerable的时候不会立即返回结果,必须调用ToList才能获取到实际查询结果,ToList返回的是一个不可变的List集合。
linq sql语法区别
// sql语法 select id,name.gender,age from tb-student where id=20;
//linq语法 from ...in...select
IEnumerable<int> result5=from i in ints select i;
IEnumerable<int> result6 = from i in ints where i>50 select i;
对象操作方式
举个栗子
public class Student
{
public int? Id {
get; set; }
public string Name {
get; set; }
public string Gender {
get; set; }
public int? Age {
get; set; }
}
var type=typeof(Student);
var props=type.GetProperties();
var resul= props.Where(a => !a.Name.Equals("Id")).Select(a => a.Name);
Console.Write(String.Join(",", resul));
常见方法
准备数据集合
IEnumerable ints = new List() { 36,56,89,88,90,40};
public class Student
{
public int? StuId {
get; set; }
public string? StuName {
get; set; }
public int? StuAge {
get; set; }
public string? StuGender {
get; set; }
public DateTime? StuBirthday {
get; set; }
}
public class Exame
{
public int? StuId {
get; set; }
public int? Grade {
get; set; }
}
{
static Random random = new Random();
public static List<Student> LSStudents = new List<Student>();
public static List<Exame> LSexames = new List<Exame>();
{
string gender;
for (int i = 0; i < 8; i++)
{
if (i%2==0)
{
gender = "女";
}
else
{
gender = "男";
}
int ID = random.Next(0, 20);
LSStudents.Add(new Student {
StuId = ID, StuAge = random.Next(18, 25), StuBirthday = DateTime.Now.AddYears(-random.Next(0, 3)), StuName = $"Stu{
i}", StuGender = gender });;
LSexames.Add(new Exame {
StuId= ID ,Grade=random.Next(80,100)});
}
}
}
Where
//lambda
IEnumerable<int> result = ints.Where(i => i > 50);
//linq
IEnumerable<int> result6 = from i in ints where i>50 select i;
//筛选
var result7 = LSStudents.Where(stu=> stu.StuAge>20).ToList();
Count
var result1 = ints.Count(i => i > 50);
First
Student student= LSStudents.First();//等同于LSStudents[0]
Student student1 = LSStudents.First(s=>s.StuGender.Equals("女"));
Last
Student student2 = LSStudents.Last();
Student student3 = LSStudents.Last(s => s.StuGender.Equals("女"));
Any、All
bool b1 = LSStudents.Any();//是否包含元素
//是否有年龄大于22岁的
bool b2 = LSStudents.Any(s => s.StuAge > 22);
bool b3 = LSStudents.All(s => s.StuAge > 15);
bool b4 = LSStudents.All(s => s.StuAge > 22);
Skip、SkipWhile
//不保留前三个对象
List<Student> LSStu = LSStudents.Skip(3).ToList();
///排除集合刚开始遇到符合条件的对象
List<Student> LSStu1 = LSStudents.SkipWhile(s=>s.StuGender.Equals("女")).ToList();
Take
var result13 = LSStudents.Skip(5).Take(2).ToList();
Select
//获取所有数字个位数的数字
IEnumerable<int> result3 = ints.Select(i => i % 10);
//将结果组合成新的元素集合
var result4 = ints.Where(i => i > 60).Select(i=>$"数据大于60===={
i}");
IEnumerable<int> result5=from i in ints select i;
选出匿名对象
//选出匿名对象
var result11 = LSStudents.Select(s => new {
id = s.StuId, name = s.StuName,age=s.StuAge }).ToList();
foreach (var item in result11)
{
Console.WriteLine($"{
item.name}----{
item.age}");
}
生成指定对象
public class SeleteClass
{
public int? id {
get; set; }
public int? age {
get; set; }
public string? Name {
get; set; }
}
//生成特定对象
List<SeleteClass> result12 = LSStudents.Select(s => new SeleteClass {
id = s.StuId, Name = s.StuName ,age=s.StuAge}).ToList();
GroupBy 分组
var result8 = LSStudents.GroupBy(stu=>stu.StuGender).ToList();
OrderBy 升序
var result9 = LSStudents.OrderBy(stu => stu.StuId).ToList();
OrderByDescending 降序
var result10 = LSStudents.OrderByDescending(stu => stu.StuId).ToList();
Sum
var result2 = ints.Sum();
int? sumage = LSStudents.Select(s => s.StuAge).Sum();
Min
int? minage = LSStudents.Select(s => s.StuAge).Min();
Max
int? maxage = LSStudents.Select(s => s.StuAge).Max();
Average
double? average = LSStudents.Select(s => s.StuAge).Average();
Count
int count= LSStudents.Count();
int count1= LSStudents.Count(s=>s.StuGender.Equals("女"));
Contains
Student student0 = new Student();
Student student4 = LSStudents[2];
bool b5 = LSStudents.Contains(student4);
bool b6 = LSStudents.Contains(student0);
演示
Where
//流式查询
var results = LSStudents.Where(s => s.StuGender.Equals("男"));
//表达式查询
var result19 = from s in LSStudents where s.StuGender.Equals("男") select s;
StartsWith
//流式查询
var resu = LSStudents.Where(s => s.StuName.StartsWith("S"));
//表达式查询
var result20 = from s in LSStudents where s.StuName.StartsWith("S") select s;
GroupBy
//流式查询
var resu = LSStudents.GroupBy(s=>s.StuGender);
//表达式查询
var resull = from s in LSStudents group s by s.StuGender;
GroupBy、Select、Average
//查询平均年龄
//流式查询
var resu = LSStudents.GroupBy(s => s.StuGender).Select(s=>new {
gender=s.Key,average=s.Average(p=>p.StuAge) }); ;
//表达式查询
var resull = from s in LSStudents group s by s.StuGender into n select new {
gender=n.Key,average=n.Average(t=>t.StuAge)};
OrderByDescending
var resut = LSStudents.OrderByDescending(s => s.StuAge);
var resul = from s in LSStudents orderby s.StuAge descending select s;
OrderBy、ThenBy
var resut = LSStudents.OrderBy(t => t.StuAge).ThenBy(t => t.StuName);
var results=from s in LSStudents orderby s.StuAge,s.StuName select s;
join 、Where、select 、new (筛选特定条件信息)
//连表查询--条件查询
{
//流式查询
Console.WriteLine("----流式查询-----");
var resu = LSStudents.Join(LSexames, s => s.StuId, e => e.StuId, (s, e) => new
{
name = s.StuName,
grade = e.Grade,
gender = s.StuGender
}).Where(n => n.gender.Equals("女"));
foreach (var item in resu)
{
Console.WriteLine($"{
item.name}---{
item.grade}---{
item.gender}");
}
//表达式查询
Console.WriteLine("----表达式查询-----");
var query = from s in LSStudents
join c in LSexames on s.StuId equals c.StuId
where .StuGender.Equals("女")
select (new {
name = s.StuName, grade = c.Grade, gender = s.StuGender }) ;
foreach (var item in query)
{
Console.WriteLine($"{
item.name}---{
item.grade}---{
item.gender}");
}
}
Join 、 group by、select into(按照特定条件进行分类)
//按照性别进行分类
//流式查询
Console.WriteLine("----流式查询-----");
var resu = LSexames.Where(e => e.Grade>90).
Join(LSStudents, s => s.StuId, e => e.StuId, (e, s) => new {
name = s.StuName,
grade = e.Grade, gender = s.StuGender }).GroupBy(t=>t.gender);
foreach (var item in resu)
{
Console.WriteLine($"{
item.Key}----{
item.Count()}");
foreach (var s in item)
{
Console.WriteLine($"{
s.name}---{
s.gender}---{
s.grade}");
}
}
Console.WriteLine("----表达式查询-----");
var resul = from s in LSStudents
join e in LSexames on s.StuId equals e.StuId
where e.Grade > 90
select (new {
name = s.StuName,
grade = e.Grade,
gender = s.StuGender
}) into g group g by g.gender;
foreach (var item in resu)
{
Console.WriteLine($"{
item.Key}----{
item.Count()}");
foreach (var s in item)
{
Console.WriteLine($"{
s.name}---{
s.gender}---{
s.grade}");
}
}
Join 、 group by、select into、Max、Average
//流式查询
var resut = LSexames.Join(LSStudents, e => e.StuId, s => s.StuId, (e, s) => new {
e.Grade, s.StuGender, s.StuName, s.StuBirthday, s.StuAge })
.GroupBy(t => t.StuGender).Select(t => new
{
gender = t.Key,
maxage = t.Max(r => r.StuAge),
minage = t.Min(t => t.StuAge),
maxgrade = t.Max(r => r.Grade),
mingrade = t.Min(r => r.Grade),
average = t.Average(r => r.StuAge),
Avergrade = t.Average(r => r.StuAge)
}).GroupBy(n=>n.gender);
Console.WriteLine("----流式查询-----");
foreach (var itm in resut)
{
Console.WriteLine(itm.Key);
foreach (var item in itm)
{
Console.WriteLine($"average:{
item.average}----maxgrade:{
item.maxgrade}----mingrade:{
item.mingrade}----Avergrade:{
item.Avergrade}");
}
}
//表达式查询
Console.WriteLine("----表达式查询-----");
var re = from s in LSStudents join e in LSexames on s.StuId equals e.StuId
let n = new {
e.Grade, s.StuGender, s.StuName, s.StuBirthday, s.StuAge } group n by n.StuGender into nw
let nww = new {
gender = nw.Key,
maxage = nw.Max(r => r.StuAge),
minage = nw.Min(t => t.StuAge),
maxgrade = nw.Max(r => r.Grade),
mingrade = nw.Min(r => r.Grade),
average = nw.Average(r => r.StuAge),
Avergrade = nw.Average(r => r.StuAge)
} group nww by nww.gender;
foreach (var itm in re)
{
Console.WriteLine(itm.Key);
foreach (var item in itm)
{
Console.WriteLine($"average:{
item.average}----maxgrade:{
item.maxgrade}----mingrade:{
item.mingrade}----Avergrade:{
item.Avergrade}");
}
}