Не могу добавить один список в другой в C # ... пытаясь использовать AddRange - PullRequest
8 голосов
/ 12 ноября 2009

Привет. Я пытаюсь добавить 1 список в другой. Я делал это раньше, используя AddRange(), но, похоже, он здесь не работает ... Вот код:

IList<E> resultCollection = ((IRepository<E, C>)this).SelectAll(columnName, maxId - startId + 1, startId);                
IList<E> resultCollection2 = ((IRepository<E, C>)this).SelectAll(columnName, endId - minId + 1, minId);
resultCollection.ToList().AddRange(resultCollection2);

Я сделал отладку, чтобы проверить результаты, вот что я получил: resultCollection имеет счет 4 resultCollection2 имеет счет 6, а после добавления диапазона resultCollection все еще имеет счет 4, когда он должен иметь счет 10.

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

Спасибо,
Matt

Ответы [ 5 ]

31 голосов
/ 12 ноября 2009

Когда вы звоните ToList(), вы не заключаете коллекцию в List<T>, а создаете новый List<T> с теми же элементами в нем. То, что вы фактически делаете здесь, это создание нового списка, добавление элементов к нему, а затем выбрасывание списка.

Вам нужно сделать что-то вроде:

List<E> merged = new List<E>();
merged.AddRange(resultCollection);
merged.AddRange(resultCollection2);

В качестве альтернативы, если вы используете C # 3.0, просто используйте Concat, например,

resultCollection.Concat(resultCollection2); // and optionally .ToList()
4 голосов
/ 12 ноября 2009

Я предполагаю, что .ToList () создает новую коллекцию. Поэтому ваши предметы добавляются в новую коллекцию, которая немедленно выбрасывается, а оригинал остается нетронутым.

1 голос
/ 12 ноября 2009

Попробуйте

IList newList = resultCollection.ToList (). AddRange (resultCollection2);

List<E> newList = resultCollection.ToList();
newList.AddRange(resultCollection2);
1 голос
/ 12 ноября 2009

resultCollection.ToList() вернет новый список.

Попробуйте:

List<E> list = resultCollection.ToList();
list.AddRange(resultCollection2);
0 голосов
/ 12 ноября 2009

Вы можете использовать любое из следующего:

List<E> list = resultCollection as List<E>;
if (list == null)
    list = new List<E>(resultCollection);
list.AddRange(resultCollection2);

Или:

// Edit: this one could be done with LINQ, but there's no reason to limit
//       yourself to .NET 3.5 when this is just as short.
List<E> list = new List<E>(resultCollection);
list.AddRange(resultCollection2);

Или:

List<E> list = new List<E>(resultCollection.Concat(resultCollection2));
...