如何向我的库添加 LINQ 支持?

问题描述 投票:0回答:3

我想向我的库添加 LINQ 支持,这样我就可以像使用

System.Xml
一样使用类似 SQL 的查询。我该怎么做?

c# linq
3个回答
26
投票

实现 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 文档的LINQ 查询方法列表。例如(假设您的

PList
PListItem
的列表):

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


1
投票

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


1
投票

由于 LINQ to 对象适用于任何继承自

IEnumerable<T>
的类,因此在您的类中实现该接口就足够了。

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

© www.soinside.com 2019 - 2024. All rights reserved.