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

时间:2016-10-04 11:51:11

标签: c# linq ienumerable predicate icollection

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

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

2 个答案:

答案 0 :(得分:9)

上面的代码只是一个extension method,它迭代一个集合并只返回与谓词匹配的项目:

  

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

我不会称之为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;
      }
   }
}

答案 1 :(得分:1)

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

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

使用以下谓词:

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

使用您的扩展方法将返回带有一个项目的IEnumerable - &#34; dave&#34;:

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

泛型类型的乐趣意味着您可以自由地提供包含任何对象风格的IEnumerable和相应的谓词,并且您的扩展方法仍然有效。