0
        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);
        } 

上述 linq 查询中的索引是什么?它如何从数组中获取索引?

4

1 回答 1

4

上述 linq 查询中的索引是什么?

它是正在处理的元素的索引。因此,第一个元素 (5) 的索引为 0,第二个元素 (4) 的索引为 1,依此类推。

它如何从数组中获取索引?

这就是重载的Select作用:

selector 的第一个参数表示要处理的元素。selector 的第二个参数表示源序列中该元素的从零开始的索引。例如,如果元素的顺序已知并且您想对特定索引处的元素执行某些操作,这将很有用。如果您想检索一个或多个元素的索引,它也很有用。

虽然真正的实现Select有点复杂(我相信)它在逻辑上实现有点像这样:

public static IEnumerable<TResult> Select<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, int, TResult> selector)
{
    // Method is split into two in order to make the argument validation
    // eager. (Iterator blocks defer execution.)
    if (source == null)
    {
        throw new ArgumentNullException("source");
    }
    if (selector == null)
    {
        throw new ArgumentNullException("selector");
    }
    return SelectImpl(source, selector);
}

private static IEnumerable<TResult> SelectImpl<TSource, TResult>(
this IEnumerable<TSource> source,
Func<TSource, int, TResult> selector)
{
    int index = 0;
    foreach (TSource item in source)
    {
        yield return selector(item, index);
        index++;
    }
}
于 2013-11-08T07:02:00.447 回答