我想将 LINQ 支持添加到我的Apple 属性列表(属性列表)解析器(二进制、JSON 和 XML)中,这样我就可以像使用System.Xml
. 它通过完全解析文件并将其保存在堆上来工作。(喜欢System.Xml
)。
我一直在谷歌搜索,似乎无法理解其中的任何内容(我得到了很多Using LINQ to SQL Classes
页面)。MSDN上的指南,我也不明白。我需要做什么?
我想将 LINQ 支持添加到我的Apple 属性列表(属性列表)解析器(二进制、JSON 和 XML)中,这样我就可以像使用System.Xml
. 它通过完全解析文件并将其保存在堆上来工作。(喜欢System.Xml
)。
我一直在谷歌搜索,似乎无法理解其中的任何内容(我得到了很多Using LINQ to SQL Classes
页面)。MSDN上的指南,我也不明白。我需要做什么?
实现 LINQ 仅仅意味着实现 LINQ 期望的方法,例如Where
or Select
,具有正确的签名。尽管有共同的看法,但您不必IEnumerable
为您的类实现接口来支持 LINQ。但是,实现IEnumerable
将自动为您提供类上的整套 LINQ 方法,Enumerable
几乎是免费的——您只需要实现GetEnumerator
一个IEnumerator
类。
IEnumerable
在我的博客上,有几个关于如何实现的示例,在这篇关于迭代器模式的文章中。
但是,如果您的类可枚举没有意义,则无需这样做。您只需要直接实现适当的 LINQ 方法。只要 C# 编译,LINQ 实际上并不关心方法是如何定义的。也就是说,如果你写:
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
s 的列表):
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>
,因此通过在您的类中继承该接口并定义 GetEnumerable 方法就足够了。
以下链接解释了如何实现 IEnumerable 接口(虽然它没有提到 LINQ,但它会起作用): http ://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-你的自定义对象/