解释Linq Microsoft Select - 索引[示例]

jp2*_*ode 4 c# linq

我正在运行Microsoft 101的LINQ示例,我对这个查询如何知道如何将正确的int值分配给正确的int字段感到困惑:

public void Linq12()
{
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };

    var numsInPlace = numbers.Select((num, index) => new { Num = num, InPlace = (num == index) });

    Console.WriteLine("Number: In-place?");
    foreach (var n in numsInPlace)
    {
        Console.WriteLine("{0}: {1}", n.Num, n.InPlace);
    }
}
Run Code Online (Sandbox Code Playgroud)

我在SO#336758中看到之前的例子中有错误,但更有可能的是我错过了一些东西.

有人可以解释一下这个以及编译器如何正确理解这些数据?

编辑:

好吧,我认为我的混淆来自LINQ扩展,它使Select功能可以工作.该Func键和两个INT参数IEnumerable<TResult> IEnumerable<int>.Select(Func<int,int,TResult> selector)是最有可能的关键,我不理解.

在此输入图像描述

Tom*_*son 6

我不确定你在问什么但是Select从索引0开始迭代列表.如果当前索引处的元素值等于索引,它会将InPlace匿名对象中的属性设置为true.我的猜测是上面的代码在3,6和7中打印为true,对吧?

如果你写下你不理解的东西,它也会更容易解释.

Jon Skeet写了一系列博客文章,他实现了linq,在Select这里阅读:Select的重新实现

更新:我注意到你对其中一条评论的评论,似乎是lambda而不是linq本身令你感到困惑.如果您阅读Skeet的博客文章,您会看到Select有两个重载:

public static IEnumerable<TResult> Select<TSource, TResult>( 
    this IEnumerable<TSource> source, 
    Func<TSource, TResult> selector) 

public static IEnumerable<TResult> Select<TSource, TResult>( 
    this IEnumerable<TSource> source, 
    Func<TSource, int, TResult> selector)
Run Code Online (Sandbox Code Playgroud)

Select索引的第二过载相匹配.正如你所看到的那样IEnumerable<TSource>,在你的情况下,它是一个扩展名,ints因此你正在调用Selecton IEnumerable<int>和a的签名Select变为:Select<int, TResult>(this IEnumerable<int> source, Func<int, int, TResult> selector).正如你所看到的,我改变了TSource反对int,因为这是你的通用类型IEnumerable<int>.TResult从那以后我仍然使用匿名类型.这可能解释一些部分?