LINQ, кажется, добавляет свой индекс (с использованием 2-параметрической перегрузки до .Select
; я предполагаю, что LINQ генерирует индекс, поскольку словари не имеют ни одного) целым числом с использованием конкатенации строк, а не сложения.Почему LINQ обрабатывает свой индекс как строку?
Следующий код возвращает myStr_3
, myStr_13
, myStr_23
, т.е. добавляет индекс словаря i
и число count
, как если бы они были строками, так 1 + 3
становится 13
, а не 4
:
// myDictionary is <string, object>
int parmCount = parameters.Count; // 3
int count = parmCount; // Closure safety
var setValues = myDictionary.Select((d, i) => "myStr_" + i + count);
Видимо индекс 0 эквивалентно пустой строке, а не «0». Weird.
Следующий код (обратите внимание на дополнительные параметры) возвращает правильные результаты; myStr_3
, myStr_4
, myStr_5
:
int parmCount = parameters.Count; // 3
int count = parmCount;
var setValues = myDictionary.Select((d, i) => "myStr_" + (i + count));
Update: Так "myStr_" + i
полученные «правильные результаты», я прыгнул к выводу, что использование дополнительной целочисленной переменной в настоящее время обрабатываются неправильно, не задумываясь о том, как i
использовался. Поведение LINQ, конечно, совершенно правильно. Мне просто нужно прекратить публиковать вопросы, когда я устал.
MSDN says:
Второй аргумент селектор представляет собой отсчитываемый от нуля индекс этот элемент в исходной последовательности.
Хотя тип индекса не указан, это для меня, а слово «индекс» означает числовой тип.
Почему LINQ добавляет два целых числа, как если бы они были строками?
вы можете опубликовать воспроизводимый пример? [Я не могу воспроизвести его в данный момент] (https://dotnetfiddle.net/j6vjpG) –
Ваш первый код должен выдавать выходные данные, такие как 'myStr_03', а не' myStr_3' – Habib
@Habib Вы правы. См. Ответ на Selman22 ниже. Этот вопрос не был моим лучшим на SO. :) –