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

如何自行实现LINQ的Where操作?现有实现效果等同于LastOrDefault

问题根因
  • 返回值定义错误:LINQ标准Where方法需要返回所有符合条件的元素集合,所以返回值应该是IEnumerable<T>而不是单个T类型
  • 实现逻辑错误:当前逻辑是遍历过程中每次匹配到符合条件的元素就覆盖同一个单个变量,遍历结束后只会保留最后一个匹配的元素,所以效果等同于LastOrDefault
正确实现代码

优先推荐用yield return实现,保留原生LINQ的延迟执行特性:

public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> myLst, Predicate<T> predicate)
{
    // 入参空校验,避免空引用异常
    if (myLst == null) throw new ArgumentNullException(nameof(myLst));
    if (predicate == null) throw new ArgumentNullException(nameof(predicate));
    
    foreach (var item in myLst)
    {
        if (predicate.Invoke(item))
        {
            // 匹配到元素立即返回,实现迭代器效果
            yield return item;
        }
    }
}

如果不需要延迟执行,也可以用集合存储结果后返回:

public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> myLst, Predicate<T> predicate)
{
    if (myLst == null) throw new ArgumentNullException(nameof(myLst));
    if (predicate == null) throw new ArgumentNullException(nameof(predicate));
    
    List<T> result = new List<T>();
    foreach (var item in myLst)
    {
        if (predicate.Invoke(item))
        {
            result.Add(item);
        }
    }
    return result;
}
调用代码修正

原有调用里打印变量写错,遍历过程中应该输出当前迭代元素item而不是整个集合myWhereItem:

var myWhereItem = fruits.MyWhere(fruit => fruit.Length < 6);

Console.Write("MyWhere: ");
foreach (string item in myWhereItem)
{
    Console.Write(item + ", ");
}

内容的提问来源于stack exchange,提问作者ninia sabadze

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:54:02