12

我想将 LINQ 支持添加到我的Apple 属性列表(属性列表)解析器(二进制、JSON 和 XML)中,这样我就可以像使用System.Xml. 它通过完全解析文件并将其保存在堆上来工作。(喜欢System.Xml)。

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

4

3 回答 3

25

实现 LINQ 仅仅意味着实现 LINQ 期望的方法,例如Whereor 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 查询方法列表。例如(假设您PListPListItems 的列表):

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# 为你完成所有工作,事情就会变得容易得多。

于 2012-06-17T03:23:27.167 回答
1

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

于 2012-06-17T03:04:34.913 回答
1

由于 LINQ to 对象适用于任何继承自 的类IEnumerable<t>,因此通过在您的类中继承该接口并定义 GetEnumerable 方法就足够了。

以下链接解释了如何实现 IEnumerable 接口(虽然它没有提到 LINQ,但它会起作用): http ://codebetter.com/davidhayden/2005/03/08/implementing-ienumerable-and-ienumerator-on-你的自定义对象/

于 2012-06-17T02:57:54.047 回答