【问题标题】:What's the most efficient way to combine two List(Of String)?组合两个 List(Of String) 的最有效方法是什么?
【发布时间】:2011-01-28 07:03:34
【问题描述】:

假设我有:

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

Dim los2 as New List(Of String)
los2.Add("More values")

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

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

【问题讨论】:

  • 定义高效。速度,记忆力?
  • 我想我应该更具体一些。我主要是在寻找最快的解决方案,但内存使用也应该是一个考虑因素。 :)

标签: asp.net vb.net generics .net-2.0 performance


【解决方案1】:

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

Dim combined = los1.Concat(los2)

这将返回一个IEnemurable(Of String),其中包含los1los2 中的所有元素。它不会分配一个巨大的新集合,而是会遍历 2 个单独的集合。

【讨论】:

  • 特别是如果只需要foreach他们。内存不会被浪费。
  • 如果你使用这个方法,看在上帝的份上,打开 Option Infer。 (否则combinedObject,VB 会让你尝试anything。)或者,你可以输入Dim combined As IEnumerable(Of String)...顺便说一句,你有一个挥之不去的分号那里;)
  • 这有效,但当然只适用于List (Of String)。对于我自己,我需要一些可以与其他对象一起使用的东西。
【解决方案2】:

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

Dim combined As New List(Of String)(los1.Concat(los2));

编辑:您知道,仅仅因为您使用的是 .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;
    }
}

那么,看这里:

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))

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

【讨论】:

  • 你知道,我从没想过为我的 .NET 2.0 项目重新创建 LINQ 扩展(尽管我可能应该这样做)。向您 +1,感谢您让我看到新事物!
  • @Jason:是的,我可以看到您遇到的主要问题是缺少扩展方法,这使得通过方法链接获得看起来干净的代码变得更加困难。但是,这可以通过编写一个包装 IEnumerable(Of T) 并提供所有 LINQ 扩展(您关心的)等价物作为方法的类来轻松实现。事实上,我已经编写了一个库来实现这一点,并且正在考虑将它放在一个 OSS 托管站点上。如果您有兴趣,请告诉我。
【解决方案3】:

我认为

los1.AddRange(los2)

【讨论】:

  • 只要你不介意 los1 被改变,这个方法就可以工作。此外,它比 Concat 慢,因为它需要为 los1 中的新项目分配内存。
  • 是的,我认为 los1 可以更改。你说的比 Concat 慢的说法很有趣。谢谢
  • 这是对我有用的方法,主要是因为我坚持使用 .NET 2.0 框架。
【解决方案4】:

Union() 如果你想要一个不同的条目列表(我相信它只做一个不同的),可能是另一种选择。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多