C# 将LINQ添加到我的类中

C# 将LINQ添加到我的类中,c#,linq,C#,Linq,我想向我的(属性列表)解析器(二进制、JSON和XML)添加LINQ支持,这样我就可以像使用System.XML一样使用类似SQL的查询。它的工作原理是完全解析文件并将其保存在堆中。(比如System.Xmldoes) 我一直在谷歌上搜索,似乎什么都看不懂(我用LINQtoSQL类得到了很多页面)。导游过来了,我也不明白。我需要做什么?既然LINQ to objects可以处理从IEnumerable继承的任何类,那么在类中继承该接口并定义GetEnumerable方法就足够了 下面的链接解释了

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


我一直在谷歌上搜索,似乎什么都看不懂(我用LINQtoSQL类得到了很多
页面)。导游过来了,我也不明白。我需要做什么?

既然LINQ to objects可以处理从
IEnumerable
继承的任何类,那么在类中继承该接口并定义GetEnumerable方法就足够了

下面的链接解释了如何实现IEnumerable接口(虽然没有提到LINQ,但它可以工作):
必须首先实现IEnumerable。
首先-

实现LINQ仅仅意味着实现LINQ期望存在的方法,例如
Where
Select
,并具有正确的签名。尽管大家都这么认为,但您不必为类实现
IEnumerable
接口来支持LINQ。但是,实现
IEnumerable
将自动获得
Enumerable
类上几乎免费的整套LINQ方法——您只需实现
GetEnumerator
IEnumerator

在我的博客上,关于如何实现
IEnumerable
,这里有几个例子

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

from p in myPlist where p.Thing == "Thing" select p;
C#编译器将此转换为:

mpPlist.Where(p => p.Thing == "Thing").Select(p => p);
只要编译完成,LINQ就会工作。要查看方法的正确签名,请参阅MSDN文档。例如(假设您的
PList
PListItem
s的列表):

公共类PList
{
公共IEnumerable,其中(Func谓词)
{
foreach(此.items中的变量项)
{
if(谓语(项))
{
收益回报项目;
}
}
}
}
虽然以这种方式直接实现LINQ可以让您对其行为有更多的控制,但要正确实现它需要做更多的工作,而且您需要了解返回值的含义,以及链接LINQ调用等。一般来说,如果你能让你的类实现
IEnumerable
,让C为你做所有的工作,事情就会简单得多。

进入С,你必须像继承一样声明它,并实现定义到接口中的所有成员。例如,如果您有接口IBoostable,其中包含描述为void Boost(int乘数)的方法,您必须编写类似于“类MyClass:IBoostable{public void Boost(int-multiplier){doSomething(multiplier);}”的内容
public class PList
{
  public IEnumerable<PListItem> Where(Func<PListItem, bool> predicate)
  {
    foreach (var item in this.items)
    {
      if (predicate(item)) 
      {
        yield return item;
      }
    }
  }
}