我想向我的库添加 LINQ 支持,这样我就可以像使用
System.Xml
一样使用类似 SQL 的查询。我该怎么做?
实现 LINQ 只是意味着使用正确的签名实现 LINQ 期望的方法,例如
Where
或 Select
。尽管有普遍的看法,您不必为您的类实现 IEnumerable
接口来支持 LINQ。但是,实现 IEnumerable
将自动 几乎免费地为您提供 Enumerable
类上的整套 LINQ 方法——您只需实现 GetEnumerator
和一个 IEnumerator
类。
我的博客上有几个关于如何实现
IEnumerable
的示例,在这篇关于迭代器模式的文章中。
但是,如果您的类可枚举没有意义,则不需要这样做。您只需直接实现适当的 LINQ 方法即可。 LINQ 实际上并不关心如何定义方法,只要 C# 编译即可。也就是说,如果你写:
from p in myPlist where p.Thing == "Thing" select p;
C# 编译器将其翻译为:
mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
只要编译通过,LINQ 就可以工作。要查看方法的正确签名,请查看 MSDN 文档的LINQ 查询方法列表。例如(假设您的
PList
是 PListItem
的列表):
public class PList
{
public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
{
foreach (var item in this.items)
{
if (predicate(item))
{
yield return item;
}
}
}
}
虽然以这种方式直接实现 LINQ 可以让您更好地控制它的行为方式,但要使其正确,需要做更多很多工作,并且您需要了解返回值的含义以及链接 LINQ 调用等。一般来说,如果您可以让您的类实现
IEnumerable
并让 C# 为您完成所有工作,事情就会变得容易得多。
您必须首先实现 IEnumerable。 首先阅读该内容 - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx
由于 LINQ to 对象适用于任何继承自
IEnumerable<T>
的类,因此在您的类中实现该接口就足够了。
以下链接解释了如何实现 IEnumerable 接口(虽然没有提到 LINQ,但它会起作用): http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/