Linq испортить порядок массива? - PullRequest
1 голос
/ 20 сентября 2010

Обновление: ложная тревога! Источник ошибки был в другом месте. (См. В конце вопроса.)

Возможно ли, что Linq или foreach могут испортить порядок массива?

Один из моих тестеров сообщил, что столкнулся с тем, что порядок списка элементов, которые он вводил в качестве входных данных, не соответствует порядку окончательного списка, который был сохранен в базе данных. Точнее, первый элемент стал последним.

Итак, я просмотрел свой код шаг за шагом, и я понятия не имею, что должно изменить порядок. Однако есть запрос Linq и цикл foreach. Возможно ли, что один из них может испортить порядок массива?

Код, упрощенный:

List<FooBar> fooBarList = new List<FooBar>();

string[][] theData = new string[][] { 
    new string[] { "a", "x" },
    new string[] { "b", "y" },
    new string[] { "c", "z" } };

FooBar[] fooBarArray = theData.Select(
    row => new FooBar { Foo = row[0], Bar = row[1] }
    ).ToArray();

foreach (FooBar item in fooBarArray)
{
    int iRank = fooBarList.Count + 1;
    item.Ranking = iRank;
    fooBarList.Add(item);
}

Массив массивов строк theData фактически задается в качестве входных данных. Он превращается в массив бизнес-объектов. Затем они добавляются в список и им присваивается поле ранжирования. Это поле записывается в базу данных вместе с "Foo" и "Bar".

После сохранения списка в базе данных ранг «а» был 3 в этом конкретном случае. Однако я не могу воспроизвести недостойное поведение ...

Обновление: я ошибся, данные, записанные в базу данных, были правильные . Данные, которые я искал, были из бизнес-объекта, который был скопирован из оригинальный. При копировании порядок смешивался при чтении его из базы данных, и этот неправильный порядок затем сохранялся в копии объекта ... => Принято ответ Джона о том, что «LINQ to Objects обычно имеет предсказуемый порядок - другие поставщики часто нет. "

1 Ответ

3 голосов
/ 20 сентября 2010

Ну, ваш пример кода показывает только LINQ to Objects. Как вы вставляете данные в базу данных? Если он также использует LINQ, я сильно подозреваю, что причиной является проблема LINQ to SQL (или любой другой), а не LINQ to Objects.

LINQ to Objects обычно имеет предсказуемый порядок, а другие провайдеры часто этого не делают.

РЕДАКТИРОВАТЬ: Если это происходит воспроизводимо, то вы должны быть в состоянии отследить, что происходит в отладчике ... который должен дать вам несколько советов. Я подозреваю, что если вы попытаетесь создать короткую, но полную программу, которая демонстрирует проблему, вы в конечном итоге выясните, в чем дело.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...