Копировать элементы коллекции в другую коллекцию в .NET - PullRequest
15 голосов
/ 29 сентября 2008

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

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

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

Ответы [ 10 ]

34 голосов
/ 29 сентября 2008

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

4 голосов
/ 29 сентября 2008

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

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

Возможно, такая же вещь существует в VB.

2 голосов
/ 24 августа 2009

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

2 голосов
/ 29 сентября 2008

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

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

2 голосов
/ 29 сентября 2008

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

1 голос
/ 29 сентября 2008

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

1 голос
/ 29 сентября 2008

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

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

Вот связанная документация .

Тем не менее, одна вещь, которая меня беспокоит, это то, делает ли она мелкую копию или глубокую копию.

0 голосов
/ 11 марта 2018

Не уверен в этом

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

    Dim newlines = _singSongs.ToList

То есть .tolist означает, что он создает новый список

0 голосов
/ 29 сентября 2008

List.CopyTo (T []); может быть?

http://msdn.microsoft.com/en-us/library/t69dktcd.aspx

0 голосов
/ 29 сентября 2008

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

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