Linq-索引选择

时间:2013-11-08 07:00:43

标签: linq

        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查询中的索引是什么?它如何从数组中引入索引?

1 个答案:

答案 0 :(得分:4)

  

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

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

  

它如何从数组中引入索引?

这就是that overload of 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++;
    }
}