如何自己写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 并不难。
我正在自己编写 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 并不难。