You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 05:37:27