2012-07-04 4 views
1

В следующем коде приведены цифры, чье имя короче их значения. Я не понимаю, как LINQ понимает, что индекс должен быть индексом массива элемента. Может кто-нибудь объяснить мне ...Mutli Parameter Linq Query

string[] digits = { "zero", "one", "two", "three", "four", 
        "five", "six", "seven", "eight", "nine" }; 

var shortDigits = digits.Where((digit, index) => digit.Length < index); 
+0

Я не уверен, что понимаю вопрос, но кажется, что вы описываете совпадение, может показаться, что вы не понимаете, измените ли строки в массиве. – Jodrell

ответ

3

Я не могу понять, как LINQ понимает, что индекс должен быть индекс массива элемента.

Это звонок the overload which takes a predicate which is given the value and the index, всегда. В этом вся эта перегрузка.

Из документов для predicate параметра:

Функция для проверки каждого исходного элемента для состояния; второй параметр функции представляет индекс исходного элемента.

0

У этого нет волшебства. Эта специфическая перегрузка Where делает что-то вроде этого внутренне:

var index = 0; 
foreach (var item in collection) 
{ 
    if (predicate(item, index++)) { 
     yield return item; 
    } 
} 

где predicate является лямбда, что вы передаете в и collection это массив цифр.