我想在我的Apple Property List(属性列表)解析器(二进制文件,JSON和XML)中添加LINQ支持,这样我就可以像使用System.Xml
那样使用类似SQL的查询。它的工作原理是完全解析文件并将其保存在堆上。 (比如System.Xml
)。
我一直在谷歌搜索,似乎无法理解任何一个(我得到了很多Using LINQ to SQL Classes
页)。关于MSDN的指南,我也不明白。我需要做什么?
答案 0 :(得分:20)
实现LINQ只是意味着实现LINQ期望的方法,例如Where
或Select
,并使用正确的签名。尽管有共同的看法,但您不必为您的类实现IEnumerable
接口以支持LINQ。但是,实现IEnumerable
将自动几乎免费获取Enumerable
类上的整套LINQ方法 - 您只需要实现GetEnumerator
和IEnumerator
课程。
有关如何在我的博客上实施IEnumerable
的几个示例,在这篇关于the Iterator pattern的帖子中。
但是,如果您的班级可以枚举是没有意义的,那么您不需要这样做。您只需要直接实现适当的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文档的list of LINQ query methods。例如(假设您的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可以让您更好地控制它的行为方式,但是很多需要做更多工作才能做到正确,并且您需要了解返回值的含义,一般情况下,如果你可以让你的类实现IEnumerable
并让C#为你完成所有的工作,那么事情就会变得容易了。
答案 1 :(得分:1)
由于LINQ to对象适用于任何继承自IEnumerable<t>
的类,因此通过在类中继承该接口并定义GetEnumerable方法就足够了。
以下链接解释了如何实现IEnumerable接口(虽然它没有提到LINQ,但它可以工作): http://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-your-custom-objects/
答案 2 :(得分:1)
您必须先实现IEnumerable。 首先阅读 - http://msdn.microsoft.com/en-us/library/9eekhta0.aspx