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