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

Creating my own "LINQ" extension methods

所以我想知道是否有人会对我在这里所做的事情做一个非常详尽的解释,我知道我在做什么,代码的含义是什么,但是,如果我要解释的话,我会一无所知。

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;
}

您上面的代码只是一个 extension method 迭代集合并且 returns 仅迭代与谓词匹配的项目:

Extension methods enable you to "add" methods to existing types without creating a new derived type, recompiling, or otherwise modifying the original type.

我不会将其称为 LINQ 方法。大多数 LINQ 方法都是流畅的(您可以链接它们),就像您对扩展方法所做的那样,但是您在您的案例中缺少的是 Where 等类似方法的执行是 deferred (即项目一个接一个地消耗,并且仅在被请求时消耗)。另一方面,你的立即执行并一次性消耗整个输入序列。

查看yield return:

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";};

使用您的扩展方法将 return 一个带有一项的 IEnumerable - "dave":

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

泛型类型的乐趣在于您可以自由提供包含任何类型对象的 IEnumerable 和相应的 Predicate,并且您的扩展方法仍然有效。