0

我已经开始研究反应式框架。非常好的东西。但是在查看代码示例时,我感到很困惑。linq 语法适用于 IQueryable。我认为 linq 只适用于 IEnumerable。C# 编译器的 linq 到扩展方法转换的基础是什么?它是否需要一组具有特定接口的方法?

4

1 回答 1

5

不完全的。这只是句法翻译。例如,编译器会翻译这个:

var query = from item in source
            select item.Property;

进入

var query = source.Select(item => item.Property);

它在不了解该Select方法的情况下执行此操作。它只是进行翻译,然后尝试编译翻译后的代码。

所有翻译都仔细记录在 C# 4 规范的第 7.16 节中(当然还有早期版本的等价物)。

在 Rx 的情况下,它调用扩展 onIObservable<T>IQbservable<T>。在并行扩展的情况下,它调用扩展方法ParallelQuery<T>

你可以用它做一些疯狂的事情——我有一篇博文,其中给出了一些例子。这是另一个奇怪的:

using System;
using System.Linq;

namespace CornerCases
{
    class WeirdQueryExpression
    {
        static WeirdQueryExpression Where(Func<int, int> projection)
        {
            return new WeirdQueryExpression { Select = ignored => "result!" };
        }

        Func<Func<string, bool>, string> Select { get; set; }

        static void Main()
        {
            string query = from x in WeirdQueryExpression
                           where x * 3
                           select x.Length > 10;

            Console.WriteLine(query);
        }
    }
}

该查询转换为:

WeirdQueryExpression.Where(x => x * 3)
                    .Select(x => x.Length > 10);

...这是对返回 a 的静态方法的调用WeirdQueryExpression,然后访问Where返回 a 的属性Func<Func<string, bool>, string>。然后我们调用该委托(传入另一个委托)并将结果分配给query.

时髦吧?

于 2010-06-21T19:54:13.120 回答