如何自行实现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
相关产品推荐
相关产品推荐

