2008-09-29 3 views
14

В .NET (VB), как я могу взять все элементы в одной коллекции и добавить их во вторую коллекцию (без потери ранее существовавших элементов во второй коллекции) ? Я ищу что-то более эффективно, чем это:Копирование элементов коллекции в другую коллекцию в .NET

For Each item As Host In hostCollection1 
    hostCollection2.Add(item) 
Next 

Мои коллекции являются общие коллекции, унаследованные от базового класса - Collection (Of)

ответ

32

Вы можете использовать AddRange: hostCollection2.AddRange(hostCollection1).

4

Я знаю, что вы просите VB, но в C# вы можете просто использовать конструктор коллекции, чтобы инициализировать его любым IEnumerable. Например:

List<string> list1 = new List<string>(); 
list1.Add("Hello"); 
List<string> list2 = new List<string>(list1); 

Возможно, такой же вид существует в VB.

+0

Но будет уже существующие элементы в list2 будут потеряны? Я пытаюсь добавить во вторую коллекцию, а не дублировать первую коллекцию. – 2008-09-29 03:36:41

+0

Извините, я неправильно понял. В этом случае я бы использовал метод AddRange для моего объекта list2. – 2008-09-29 03:42:07

0

Array.Copy может решить вашу проблему.

1

решение Бен существует для VB.Net:

Dim collection As IEnumerable(Of T)  
Dim instance As New List(collection) 

Вот связанный documentation.

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

2

Не забывайте, что вы будете получать ссылку, а не копию, если вы инициализируете свой List2-List1. У вас все еще будет один набор строк, если вы не сделаете глубокий клон.

2

Я всегда использую функцию List<T>.AddRange(otherList<T>). Опять же, если это список объектов, они будут ссылками на одно и то же.

Вы не указали, какая коллекцию, хотя, AddRange не существует в CollectionBase наследуемых объектов

1

Если вы не хотите, как коллекции, чтобы изменить тот же набор объектов, то каждый объект будет иметь, чтобы скопировать к Куче. Возможно, вы можете описать свой сценарий того, как это влияет на вашу производительность, и мы можем найти хорошее решение.

1

Это доступно, если вы используете IList. Но AddRange метод не доступен в Collection. Я думал о отливке Collection в List, но это невозможно.

0

Не уверен, что для этого один

Почему бы просто не сделать это

Dim newlines = _singSongs.ToList 

Это .tolist означает, что он создает целый новый список