将LINQ添加到我的类中

时间:2012-06-17 02:51:10

标签: c# linq

我想在我的Apple Property List(属性列表)解析器(二进制文件,JSON和XML)中添加LINQ支持,这样我就可以像使用System.Xml那样使用类似SQL的查询。它的工作原理是完全解析文件并将其保存在堆上。 (比如System.Xml)。

我一直在谷歌搜索,似乎无法理解任何一个(我得到了很多Using LINQ to SQL Classes页)。关于MSDN的指南,我也不明白。我需要做什么?

3 个答案:

答案 0 :(得分:20)

实现LINQ只是意味着实现LINQ期望的方法,例如WhereSelect,并使用正确的签名。尽管有共同的看法,但您不必为您的类实现IEnumerable接口以支持LINQ。但是,实现IEnumerable自动几乎免费获取Enumerable类上的整套LINQ方法 - 您只需要实现GetEnumeratorIEnumerator课程。

有关如何在我的博客上实施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。例如(假设您的PListPListItem 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