如何将带Lambda的LINQ Where查询改写为无Lambda实现?
不用Lambda的LINQ Where实现方式
你的原代码通过Lambda表达式给Where提供筛选条件,要去掉Lambda,有两种清晰的实现方式,能帮你理解底层逻辑:
方式一:使用显式委托(Predicate)
可以通过单独定义筛选方法,或者用匿名方法(非Lambda)创建委托实例,替代Lambda传入Where:
1. 定义独立筛选方法
// 单独定义筛选逻辑方法 private static bool IsStudentNamedNav(Student student) { return student.Name == "Nav"; } // 调用Where时传入方法引用 List<Student> st = new List<Student>() { new Student(){Id=1,Name="Nav"}, new Student(){Id=2,Name="San"}, new Student(){Id=3,Name="Jat"}, }; Student? me = st.Where(IsStudentNamedNav).FirstOrDefault(); // 也可以显式创建委托实例: // Student? me = st.Where(new Predicate<Student>(IsStudentNamedNav)).FirstOrDefault();
2. 使用匿名方法(非Lambda写法)
List<Student> st = new List<Student>() { new Student(){Id=1,Name="Nav"}, new Student(){Id=2,Name="San"}, new Student(){Id=3,Name="Jat"}, }; Student? me = st.Where(delegate(Student student) { return student.Name == "Nav"; }).FirstOrDefault();
方式二:手动模拟LINQ底层逻辑
如果想彻底搞懂Where+FirstOrDefault的执行过程,可以完全跳过LINQ方法,自己实现遍历筛选:
List<Student> st = new List<Student>() { new Student(){Id=1,Name="Nav"}, new Student(){Id=2,Name="San"}, new Student(){Id=3,Name="Jat"}, }; Student? me = null; foreach (var student in st) { // 这里就是原Lambda中的筛选规则 if (student.Name == "Nav") { me = student; break; // 找到第一个匹配项就停止遍历,和FirstOrDefault逻辑一致 } }
这种写法直接展示了代码的核心逻辑:遍历列表、检查每个元素是否符合条件、返回第一个匹配项(没有则为null)。
内容的提问来源于stack exchange,提问作者Yugraaj Sandhu
相关产品推荐
相关产品推荐

