2008-09-29 9 views
14

Dans .NET (VB), comment puis-je prendre tous les éléments d'une collection et les ajouter à une seconde collection (sans perdre les éléments préexistants dans la seconde collection)? ? Je cherche quelque chose d'un peu plus efficace que ceci:Copier des éléments de collection dans une autre collection dans .NET

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

Mes collections sont des collections génériques, héritées de la classe de base - Collection (Of)

Répondre

32

Vous pouvez utiliser AddRange: hostCollection2.AddRange(hostCollection1). J'utilise toujours la fonction List<T>.AddRange(otherList<T>)

+2

'AddRange' n'est pas un membre de 'Collection'. –

4

Je sais que vous vous demandez VB, mais en C# vous pouvez simplement utiliser le constructeur de la collection pour l'initialiser avec n'importe quel IEnumerable. Par exemple:

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

Peut-être le même type de chose existe dans VB.

+0

Mais seront les éléments pré-existants dans liste2 perdu? J'essaie d'ajouter à la deuxième collection, pas exactement dupliquer la première collection. –

+0

Oh désolé, j'ai mal compris. Dans ce cas, j'utiliserais la méthode AddRange sur mon objet list2. –

+0

Vous venez d'ajouter à votre message que vous utilisez la classe Collection de base.Dans ce cas, aucune des solutions AddRange ne fonctionnera. Si vous utilisez .NET 3.5, nous pourrions utiliser la méthode de l'extension route ... –

0

Array.Copy peut résoudre votre problème.

1

solution de Ben existe pour VB.Net:

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

Voici le documentation lié.

Cependant, une chose que je voudrais savoir est de savoir si oui ou non il fait une copie superficielle ou une copie profonde.

2

N'oubliez pas que vous obtiendrez une référence et non une copie si vous initialisez votre List2 à List1. Vous aurez toujours un ensemble de chaînes, sauf si vous faites un clone profond.

2

Encore une fois, s'il s'agit d'une liste d'objets, ils seront les mêmes références.

Vous n'avez pas spécifié quel type de collection si, AddRange n'existe pas dans CollectionBase objets hérités

1

Sauf si vous voulez que les deux collections de modifier le même ensemble d'objets, chaque objet va être copié au tas. Peut-être que vous pouvez décrire votre scénario de comment cela affecte votre performance et nous pouvons trouver une bonne solution.

1

Ceci est disponible lorsque vous utilisez un IList. Mais la méthode AddRange n'est pas disponible dans Collection. J'ai pensé à couler Collection à List, mais ce n'est pas possible.

0

Je ne sais pas pour celui

Pourquoi ne pas faire tout ce

Dim newlines = _singSongs.ToList 

Ce .ToList signifie qu'il crée une nouvelle liste complète

Questions connexes