2013-11-08 7 views
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? Как он выводит индекс из массива?Linq- Indexed Select

ответ

4

Что такое индекс в вышеуказанном запросе linq?

Это индекс обрабатываемого элемента. Таким образом, первый элемент (5) будет иметь индекс 0, второй элемент (4) будет иметь индекс 1 и т. Д.

Как он выводит индекс из массива?

Это именно то, что делает that overload of Select:

Первый аргумент селектор представляет элемент для обработки. Второй аргумент для селектора представляет нулевой индекс этого элемента в исходной последовательности. Это может быть полезно, если элементы находятся в известном порядке, и вы хотите что-то сделать с элементом в конкретном индексе, например. Это также может быть полезно, если вы хотите получить индекс одного или нескольких элементов.

Хотя реальное осуществление 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++; 
    } 
}