СПИСОК <> бросок AddRange ArgumentException

У меня есть конкретный метод, который иногда отказывает с ArgumentException:

Destination array was not long enough. Check destIndex and length, and the array's lower bounds.:
at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
at System.Collections.Generic.List`1.CopyTo(T[] array, Int32 arrayIndex)
at System.Collections.Generic.List`1.InsertRange(Int32 index, IEnumerable`1 collection)
at System.Collections.Generic.List`1.AddRange(IEnumerable`1 collection)

Код, который вызывает этот катастрофический отказ, выглядит примерно так:

List<MyType> objects = new List<MyType>(100);
objects = FindObjects(someParam);
objects.AddRange(FindObjects(someOtherParam);

Согласно MSDN, Список <>.AddRange () должен автоматически изменить размер себя по мере необходимости:

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

Кто-то может думать об обстоятельстве, в которое AddRange мог бросить этот тип исключения?


Править:

В ответ на вопросы о FindObjects () метод. Это в основном выглядит примерно так:

List<MyObject> retObjs = new List<MyObject>();

foreach(MyObject obj in objectList)
{
   if(someCondition)
       retObj.Add(obj);
}
9
задан Tim 7 April 2010 в 14:44
поделиться

2 ответа

Вы пытаетесь обновить один и тот же список из нескольких потоков? Это может вызвать проблемы ... List небезопасен для нескольких авторов.

21
ответ дан 4 December 2019 в 10:03
поделиться

Честно говоря, я не уверен, но почему бы просто не удалить объявление размера при инициализации вашего списка?

List`<MyType>` list = new List`<MyType>`
0
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: