关于C#:将linq添加到我的类中

Adding LINQ to my classes

我想在我的Apple属性列表(属性列表)解析器(binary、json和xml)中添加LINQ支持,这样我就可以像使用System.Xml一样对它使用类似SQL的查询。它的工作原理是完全解析文件并将其保存在堆中。(就像System.Xml一样)。

我一直在谷歌搜索,似乎一点都听不懂(我有很多Using LINQ to SQL Classes页)。我也听不懂有关MSDN的指南。我需要做什么?


实现LINQ只意味着实现LINQ期望存在的方法,例如具有正确签名的WhereSelect。尽管有相同的看法,但是您不必为类实现IEnumerable接口来支持Linq。但是,实现IEnumerable将自动获得几乎免费的Enumerable类上的整个linq方法集——您只需要实现GetEnumeratorIEnumerator类。

在本篇关于迭代器模式的文章中,有几个关于如何在我的博客上实现IEnumerable的例子。

但是,如果您的类不能枚举,则不需要这样做。您只需要直接实现适当的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查询方法列表。例如(假设您的PListPListItem的列表):

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,并让C为您完成所有工作,那么事情容易多了。


必须首先实现IEnumerable。请先阅读-http://msdn.microsoft.com/en-us/library/9eekhta0.aspx


由于linq to对象与继承自IEnumerable的任何类一起工作,因此通过继承类中的接口并定义getEnumerable方法就足够了。

下面的链接解释了如何实现IEnumerable接口(尽管它没有提到LINQ,但它将起作用):http://codebetter.com/davidhayden/2005/03/08/implementation-ienumerable-and-ienumerator-on-your-custom-objects/