LIST <> AddRange, выбрасывающий ArgumentException - PullRequest
9 голосов
/ 07 апреля 2010

У меня есть определенный метод, который иногда дает сбой с 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, List <>. AddRange () должен автоматически изменять свой размер при необходимости:

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

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


Edit:

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

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

foreach(MyObject obj in objectList)
{
   if(someCondition)
       retObj.Add(obj);
}

Ответы [ 2 ]

20 голосов
/ 07 апреля 2010

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

0 голосов
/ 07 апреля 2010

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

List`<MyType>` list = new List`<MyType>`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...