所以我想知道是否有人会对我在这里做了什么做了非常彻底的解释,我知道我在做什么,以及代码的含义是什么,但是,如果我要解释它,我会无能为力。
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;
}
答案 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和相应的谓词,并且您的扩展方法仍然有效。