1

我正在搜索某个对象中的 .Where()、.All 或至少一个其他“特殊”方法的代码。我想学习如何写这样的,因为我发现它们很有用。

还有一个问题 - 为什么有些对象包含这些方法而其他对象不包含,例如,我如何在我的类中继承它们?

4

3 回答 3

2

Jon在Reimplementing LINQ to Objects中详细介绍了这一点;“哪里”是第 2 部分;“全部”是第 10 部分

对于“为什么有些对象包含这些方法而其他对象不包含这些方法,例如,我如何在我的类中继承它们?” - 标准 LINQ 操作被定义为IEnumerable<T>和(单独)上的扩展方法IQueryable<T>。如果您愿意,您可以在自己的类型上编写自己的扩展方法 - 或者只是常规的实例方法。

一个非常基本的实现Where是通过一个迭代器块;Any只是一种常规方法:

public static class SomeUtilityClass {
    public static IEnumerable<T> Where<T>(
        this IEnumerable<T> source, Func<T,bool> predicate)
    {
        foreach(var item in source)
        {
            if(predicate(item)) yield return item;
        }
    }
    public static bool All<T>(
        this IEnumerable<T> source, Func<T,bool> predicate)
    {
        foreach(var item in source)
        {
            if(!predicate(item)) return false;
        }
        return true;
    }
}
于 2012-11-08T10:04:22.650 回答
0

您可能想编写一个 LINQ 提供程序;这是一种实现 LINQ 功能的类,例如 Where()、Select() 等。

但是你为什么需要它?如果您使用 LINQ to Objects,基本上您构建的任何集合都支持 LINQ。

无论哪种方式,要了解有关构建 LINQ 提供程序的更多信息,请查看http://msdn.microsoft.com/en-us/library/bb546158.aspx上的演练文章。

这是另一个有趣的链接,就在 Stack Overflow 上:Implementing your own LINQ & IEnumerable<T>

祝你好运!

于 2012-11-08T10:01:52.230 回答
0

另一种方法是下载 ILSpy 工具并打开一个实现这些扩展的 DLL。

例如,只需在 ILSpy 中打开 System.Linq 即可显示许多标准实现。

于 2012-11-08T10:59:51.410 回答