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