创建我自己的“LINQ"扩展方法

本文关键字:quot 扩展 方法 LINQ 我自己 自己的 创建 | 更新日期: 2023-09-27 18:11:22

所以我想知道是否有人会对我在这里所做的事情做出非常彻底的解释,我知道我在做什么,以及代码的含义是什么,但是,如果我要解释它,我将无能为力。

public static IEnumerable<TSource> VisitorWhere<TSource>(this IEnumerable<TSource> enumerable, Predicate<TSource> CompareMethod)
{
    ICollection<TSource> temp = new List<TSource>();
    foreach (TSource item in enumerable)
    {
        if(CompareMethod(item))
        {
            temp.Add(item);
        }
    }
    return temp;
}

创建我自己的“LINQ"扩展方法

上面的代码只是一个扩展方法,它迭代一个集合并只返回与谓词匹配的项:

扩展方法使您能够向现有类型"添加"方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。

我不会称它为LINQ方法。大多数LINQ方法都是流畅的(你可以把它们链起来),就像你用扩展方法做的那样,但是在你的情况下,你缺少的是类似Where的方法的执行是延迟的(即项目一个接一个地被消耗,只有当它们被请求时)。另一方面,您的程序立即执行并一次消耗整个输入序列。

查看收益率:

public static IEnumerable<TSource> VisitorWhere<TSource>(this IEnumerable<TSource> enumerable, Predicate<TSource> compareMethod)
{
   foreach (TSource item in enumerable)
   {
      if (compareMethod(item))
      {
         yield return item;
      }
   }
}

这是一种使用谓词中提供的条件过滤访问者列表的方法。如果你有一个列表:

List<string> visitorList = new List<string>(){"dave", "clare", "steve"};

使用以下谓词:

Predicate<string> daveFinder = (string s) => {return s=="dave";};

使用您的扩展方法将返回一个包含一个项目的IEnumerable - "dave":

List<string> daveVisitors = visitorList.VisitorWhere(daveFinder).ToList();

泛型类型的好处是您可以自由地提供包含任何类型对象和相应谓词的IEnumerable,并且您的扩展方法仍然可以工作。