8委托、lamdba、泛型、Linq结合运用
解决多条件问题
1、创建一个学生类
class Student
{
public int Id { get; set; }//学生编号
public string Name { get; set; }//姓名
public int Age { get; set; }//年龄
public int ClassId { get; set; }//班级编号
}
2、创建一个学生类类型的集合,并且初始化几条数据
List<Student> Students = new List<Student>()
{
new Student(){ Id=0,Name="张三",Age=18,ClassId=001 },
new Student(){ Id=1,Name="李四",Age=20,ClassId=002 },
new Student(){ Id=2,Name="王五",Age=16,ClassId=002 },
};
3、现在有如下逻辑需要
1)根据学生年龄为条件,查询年龄大于或等于20岁的所有学生信息
2)根据学生班级为条件,查询年班级编号为001的所有学生信息
那么,按照逻辑可以写两个方法解决:如:
4、那么,如果有更多的条件,那这样就要写很多的方法,;因此可以使用委托解决条件不同需要写不同方法的问题
所以,我们使用委托,将一个方法传进来,在判断的时候执行即可。
//根据条件进行查询的方法
public static List<Student> GetStudents3(List<Student> Students, Func<Student, bool> func)
{
List<Student> tempStudents = new List<Student>();
foreach (var item in Students)
{
if (func(item))
{
tempStudents.Add(item);
}
}
return tempStudents;
}
这样,我们在执行的时候就可以根据不同的条件传不同的方法了
5、调用
比如:根据年龄条件来查询,就写一个年龄条件的方法,调用查询方法的时候将方法当作参数传进去即可。
定义一个根据年龄查询的方法:
public static bool ByAge(Student student)
{
return student.Age >= 20;
}
调用的时候直接将上面的方法传进去,或者用lamdba写一个符合委托的匿名方法也可以,如:
List<Student> StudentsNew = GetStudents3(Students, ByAge);
List<Student> StudentsNew2 = GetStudents3(Students, (a) => { return a.Age >= 20; });
推荐使用匿名方法
自定义一个Linq的where方法
linq的where方法和上面定义的委托为参数的方法原理基本一致,只需要将它改为一个扩展方法,并把里面的对象类型改为泛型即可
//根据条件进行查询的方法
public static List<TSource> MyWhere<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> func)
{
List<TSource> tempStudents = new List<TSource>();
foreach (var item in source)
{
if (func(item))
{
tempStudents.Add(item);
}
}
return tempStudents;
}
用linq方法调用
1,扩展方式调用
List<Student> StudentsNew = Students.MyWhere((a) => { return a.Age >= 20; }).ToList();
List<Student> StudentsNew2 = Students.Where((a) => { return a.Age >= 20; }).ToList();
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构