Reputation: 8050
Let's say I've got:
Dim los1 as New List(Of String)
los1.Add("Some value")
Dim los2 as New List(Of String)
los2.Add("More values")
What would be the most efficient way to combine the two into a single List(Of String)
?
Edit: While I love the solutions everyone has provided, I probably should have also mentioned I'm stuck using the .NET 2.0 framework.
Upvotes: 29
Views: 43522
Reputation: 754505
If you just want to see a sequence of the two lists then use the IEnumerable.Concat
method.
Dim combined = los1.Concat(los2)
This will return an IEnumerable(Of String)
which contains all of the elements in los1
and los2
. It won't allocate a huge new collection but instead will iterate over the 2 separate collections.
Upvotes: 19
Reputation: 128317
JaredPar's answer will give you an object that will enumerate over both lists. If you actually want a List(Of String)
object containing these values, it's as simple as:
Dim combined As New List(Of String)(los1.Concat(los2));
EDIT: You know, just because you're using .NET 2.0 doesn't mean you can't roll your own versions of some of the LINQ extension methods you personally find useful. The Concat
method in particular would be quite trivial to implement in C#*:
public static class EnumerableUtils {
public static IEnumerable<T> Concat<T>(IEnumerable<T> first, IEnumerable<T> second) {
foreach (T item in first)
yield return item;
foreach (T item in second)
yield return item;
}
}
Then, see here:
Dim los1 as New List(Of String)
los1.Add("Some value")
Dim los2 as New List(Of String)
los2.Add("More values")
Dim combined As New List(Of String)(EnumerableUtils.Concat(los2, los2))
* To be fair, this is a lot more straightforward in C# thanks to the yield
keyword. It could be done in VB.NET, but it'd be trickier to provide deferred execution in the same manner that the LINQ extensions do.
Upvotes: 8
Reputation: 50728
Union() potentially, if you want a distinct list of entries (I beleive it only does a distinct), is another alternative.
Upvotes: 2