组合两个List(Of String)的最有效方法是什么?

Jas*_*wne 26 vb.net asp.net generics performance .net-2.0

假设我有:

Dim los1 as New List(Of String)
los1.Add("Some value")

Dim los2 as New List(Of String)
los2.Add("More values")
Run Code Online (Sandbox Code Playgroud)

将两者合二为一的最有效方法是List(Of String)什么?

编辑:虽然我喜欢每个人提供的解决方案,但我可能也应该提到我使用.NET 2.0框架.

Jav*_*ier 35

我认为

los1.AddRange(los2)
Run Code Online (Sandbox Code Playgroud)

  • 只要你不介意los1被改变,这就行了.此外,它比Concat慢,因为它需要为los1中的新项目分配内存. (7认同)

Jar*_*Par 17

如果您只想查看两个列表的序列,请使用该Enumerable.Concat方法.

Dim combined = los1.Concat(los2)
Run Code Online (Sandbox Code Playgroud)

这将返回一个IEnemurable(Of String)包含所有元素的los1los2.它不会分配一个巨大的新集合,而是迭代2个独立的集合.

  • 如果你使用这种方法,为了上帝的爱,转向选项推断.(否则`combined`是一个`Object`,VB会让你用它来尝试*任何东西.)或者,你可以输入`Dim combined As IEnumerable(Of String)`...顺便说一句,你有那里有一个挥之不去的分号;) (4认同)

Dan*_*Tao 8

JaredPar的答案将为您提供一个将枚举两个列表的对象.如果你真的想要一个包含这些值的List(Of String)对象,它就像这样简单:

Dim combined As New List(Of String)(los1.Concat(los2));
Run Code Online (Sandbox Code Playgroud)

编辑:你知道,仅仅因为你使用的是.NET 2.0并不意味着你不能推出你自己认为有用的一些LINQ扩展方法的自己版本.Concat特别是在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,看到这里:

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))
Run Code Online (Sandbox Code Playgroud)

*公平地说,由于yield关键字,这在C#中要简单得多.它可以在VB.NET中完成,但是以与LINQ扩展相同的方式提供延迟执行会更加棘手.