如何自己写LINQ操作?

How to write LINQ operation where by myself?

我正在自己编写 LINQ 操作。目前,我在 where 方面遇到了问题。看看我的代码,这是MyWhere方法:

public static T MyWhere<T>(this IEnumerable<T> myLst, Predicate<T> predicate)
{
    T whereItem = default;
    foreach (var item in myLst)
    {
        if (predicate.Invoke(item))
        {
            whereItem = item;
            continue;
        }
    }
    return whereItem;
}

这是在主要方法中:

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

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

如何编写 Where 方法,目前是 LastOrDefault?

您的 MyWhere 方法 returns 单个值,而不是值的枚举。在您的示例代码中,您将 MyWhere 和 returns 称为单个 string 值,然后您尝试将其分配给显式类型的 IEnumerable<string>.

如果您检查 LINQ definition for From,您会发现它实际上 returns 一个 IEnumerable<TSource>。如果您正在尝试复制 LINQ 功能(这可能是一个非常糟糕的主意),最简单的选择(在现代 C# 中)是使用可枚举方法:

public static IEnumerable<T> MyWhere<T>(this IEnumerable<T> sequence, Predicate<T> predicate)
{
    foreach (var item in sequence)
    {
        if (predicate(item))
            yield return item;
    }
}

(这只是语法糖(编译器支持shorthand)在后台生成一个完整的IEnumerable<T>实现,更容易实现。)

如果您只是想了解 LINQ 的工作原理,阅读 the actual source code 并不难。