我自己写LINQ操作。目前,我在中遇到了的麻烦。看看我的代码,这是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
方法返回单个值,而不是值的枚举。在您的示例代码中,您调用MyWhere
,它返回单个string
值,然后您尝试将其分配给显式类型的IEnumerable<string>
。
如果你检查From
的LINQ定义,你会发现它实际上返回一个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;
}
}
(这只是语法糖(编译器支持的简写),用于在后台生成完整的IEnumerable<T>
实现,使其更容易实现。)
如果你只是想弄清楚LINQ是如何工作的,阅读它的实际源代码并不难。