让我解释一下:
我们知道jQuery中的map函数充当.Select()(如在LINQ中).
$("tr").map(function() { return $(this).children().first(); }); // returns 20 tds
Run Code Online (Sandbox Code Playgroud)
现在的问题是我们如何才能在jQuery中使用.SelectMany()?
$("tr").map(function() { return $(this).children(); }); // returns 10 arrays not 20 tds!
Run Code Online (Sandbox Code Playgroud)
这是我的实例:http : //jsfiddle.net/8aLFQ/4/
如果我们有selectMany,"l2"应为8.
[注意]请不要坚持这个例子,上面的代码只是显示我的意思是SelectMany()否则很容易说$("tr").children();
希望它足够清楚.
Enumerable.SelectMany有4个重载签名.为简单起见,我们忽略了带有int参数的两个签名.所以我们有4个SelectMany签名:
public static IEnumerable<TResult> SelectMany<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TResult>> selector
)
public static IEnumerable<TResult> SelectMany<TSource, TCollection, TResult>(
this IEnumerable<TSource> source,
Func<TSource, IEnumerable<TCollection>> collectionSelector,
Func<TSource, TCollection, TResult> resultSelector
)
Run Code Online (Sandbox Code Playgroud)
我的问题是:在将LINQ表达式转换为扩展方法调用时,C#编译器如何选择SelectMany?
基本上,如果LINQ表达式中有多个from,则会有SelectMany.但是,似乎C#编译器只选择第二个签名.永远不会使用第一个签名.
IEnumerable<int> en1 = Enumerable.Range(1, 3);
IEnumerable<double> en2 = new double[] { 1.0, 3.14 };
IEnumerable<string> en3 =
from i1 in en1
from i2 in en2
select (i1 * i2).ToString();
foreach (var i in en3)
{
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
在Reflector的帮助下,我可以看到上面的LINQ表达式被翻译成了
en1.SelectMany<int, double, string>(delegate (int i1) { …Run Code Online (Sandbox Code Playgroud)