2017-01-10 4 views
-3

У меня следующий код:Почему LINQ сортирует мой массив?

int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
int i = 0; 
var query = 
    from n in numbers 
    select ++i; 

foreach (var n in query) 
    Console.WriteLine("number = {0}, counter = {1}", n, i); 

Почему выход сортируется в порядке возрастания, даже когда я не давая ему orderby?

number = 1, counter = 1 
number = 2, counter = 2 
number = 3, counter = 3 
number = 4, counter = 4 
number = 5, counter = 5 
number = 6, counter = 6 
number = 7, counter = 7 
number = 8, counter = 8 
number = 9, counter = 9 
number = 10, counter = 10 
+1

'query' выбирает' 'i' не n'. –

+1

Обратите внимание, что в вашем выводе нет значения 0? – Plutonix

+0

И 10, которые не были в базовом источнике данных. – Servy

ответ

6
select ++i 

Вы выбираете i, а не значения в массиве.

1

Что-то интересное, что ваш вопрос случайно показывает, как запросы LINQ лениво оцениваются на C#. Обратите внимание на то, что выражение запроса имеет побочный эффект: оно увеличивает значение переменной i на каждой итерации. Лень оценки отдается тем фактом, что выход counter = увеличивается на каждой итерации.

Сравните выходные данные вашей программы с опубликованной ниже. Единственное различие заключается в том, что я перехожу к массиву, прежде чем перебирать его.

int[] numbers = new int[] { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; 
int i = 0; 
var query = 
    from n in numbers 
    select ++i; 

foreach (var n in query.ToArray()) 
    Console.WriteLine("number = {0}, counter = {1}", n, i); 

Выходной

number = 1, counter = 10 
number = 2, counter = 10 
number = 3, counter = 10 
number = 4, counter = 10 
number = 5, counter = 10 
number = 6, counter = 10 
number = 7, counter = 10 
number = 8, counter = 10 
number = 9, counter = 10 
number = 10, counter = 10 
Смежные вопросы