Mic*_*eld 20
实现LINQ只是意味着实现LINQ期望存在的方法,例如Where或者Select使用正确的签名.尽管有共同的看法,但您不必IEnumerable为您的类实现接口以支持LINQ.但是,实现IEnumerable将自动为您提供类中的整套LINQ方法,Enumerable几乎是免费的 - 您只需要实现GetEnumerator和IEnumerator类.
有关如何IEnumerable在我的博客上实现的几个例子,在这篇关于Iterator模式的文章中.
但是,如果您的班级可以枚举是没有意义的,那么您不需要这样做.您只需要直接实现适当的LINQ方法.只要C#编译,LINQ实际上并不关心如何定义方法.也就是说,如果你写:
from p in myPlist where p.Thing == "Thing" select p;
Run Code Online (Sandbox Code Playgroud)
C#编译器将其转换为:
mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
Run Code Online (Sandbox Code Playgroud)
只要编译,LINQ就可以工作.要查看方法的正确签名,请查看MSDN文档的LINQ查询方法列表.例如(假设你PList是一个PListItems 的列表):
public class PList
{
public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
{
foreach (var item in this.items)
{
if (predicate(item))
{
yield return item;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
虽然直接以这种方式实现LINQ让你在它的行为更多的控制,这是一个很大更多的工作来得到它的权利,你需要了解你的返回值的影响,并链接LINQ电话,等等.一般来说,如果你可以让你的课程实现IEnumerable并让C#为你完成所有的工作,事情会变得容易多了.