将LINQ添加到我的类中

Col*_*son 8 c# linq

我想LINQ支持添加到我的苹果属性列表(属性列表)解析器(二进制,JSON和XML),这样我可以使用SQL之类的查询就可以像您可以用System.Xml.它的工作原理是完全解析文件并将其保存在堆上.(喜欢System.Xml).

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

Mic*_*eld 20

实现LINQ只是意味着实现LINQ期望存在的方法,例如Where或者Select使用正确的签名.尽管有共同的看法,但您不必IEnumerable为您的类实现接口以支持LINQ.但是,实现IEnumerable自动为您提供类中的整套LINQ方法,Enumerable几乎是免费的 - 您只需要实现GetEnumeratorIEnumerator类.

有关如何IEnumerable在我的博客上实现的几个例子,在这篇关于Iterator模式的文章中.

但是,如果您的班级可以枚举是没有意义的,那么您不需要这样做.您只需要直接实现适当的LINQ方法.只要C#编译,LINQ实际上并不关心如何定义方法.也就是说,如果你写:

from p in myPlist where p.Thing == "Thing" select p;
Run Code Online (Sandbox Code Playgroud)

C#编译器将其转换为:

mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
Run Code Online (Sandbox Code Playgroud)

只要编译,LINQ就可以工作.要查看方法的正确签名,请查看MSDN文档的LINQ查询方法列表.例如(假设你PList是一个PListItems 的列表):

public class PList
{
  public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
  {
    foreach (var item in this.items)
    {
      if (predicate(item)) 
      {
        yield return item;
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然直接以这种方式实现LINQ让你在它的行为更多的控制,这是一个很大更多的工作来得到它的权利,你需要了解你的返回值的影响,并链接LINQ电话,等等.一般来说,如果你可以让你的课程实现IEnumerable并让C#为你完成所有的工作,事情会变得容易多了.

  • 顺便说一下,不错的博文! (2认同)