Перевод понимания запросов в Enumerable методы расширения в LINQ - PullRequest
3 голосов
/ 01 декабря 2010

Как мне перевести следующий запрос в функциональные вызовы?Я знаю, что компилятор делает это за кулисами, но не знаю, как бы я посмотрел результат

1 Ответ

6 голосов
/ 01 декабря 2010

В этом случае он использует SelectMany и концепцию под названием прозрачные идентификаторы , которая сохраняет существующие переменные диапазона.Таким образом, ваш запрос будет преобразован в:

var query = Enumerable.Range(0, 10)
                      .SelectMany(item => Enumerable.Range(item, 10),
                                  (item, item2) => new { item, item2 })
                      .SelectMany(z => Enumerable.Range(z.item2, 10),
                                  (z, item3) => new { z.item, z.item2, item3 });

(В этом случае z является прозрачным идентификатором. Если бы было предложение where или что-либо, кроме select после последнего from предложение, другой прозрачный идентификатор был бы введен.)

Все переводы описаны в спецификации языка C #, раздел 7.16.

...