Adding LINQ to my classes
我想在我的Apple属性列表(属性列表)解析器(binary、json和xml)中添加LINQ支持,这样我就可以像使用
我一直在谷歌搜索,似乎一点都听不懂(我有很多
实现LINQ只意味着实现LINQ期望存在的方法,例如具有正确签名的
在本篇关于迭代器模式的文章中,有几个关于如何在我的博客上实现
但是,如果您的类不能枚举,则不需要这样做。您只需要直接实现适当的LINQ方法。只要C编译,LINQ实际上并不关心如何定义方法。也就是说,如果你写:
1 | from p in myPlist where p.Thing =="Thing" select p; |
C编译器将其转换为:
1 | mpPlist.Where(p => p.Thing =="Thing").Select(p => p); |
只要编译成功,Linq就可以工作。要查看方法的正确签名,请查看msdn文档的Linq查询方法列表。例如(假设您的
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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。请先阅读-http://msdn.microsoft.com/en-us/library/9eekhta0.aspx
由于linq to对象与继承自
下面的链接解释了如何实现IEnumerable接口(尽管它没有提到LINQ,但它将起作用):http://codebetter.com/davidhayden/2005/03/08/implementation-ienumerable-and-ienumerator-on-your-custom-objects/