【问题标题】:Concatenating with List(Of String)与 List(Of String) 连接
【发布时间】:2014-03-20 20:26:05
【问题描述】:

我很难确定如何将一个简单的字符串连接到每个元素的末尾。任何帮助表示赞赏。请参阅下面的示例代码:

Dim Results As New List(Of String)

Results.Add("Test1")
Results.Add("Test2")
Results.Add("Test3")

For Each item in Results
    item = item.ToString.Concat(item.ToString, " xx") '  <--- This won't work!
Next

【问题讨论】:

  • 作为附加建议: 调用 ToString() 实例的 ToString() 方法几乎没有用。 ;)

标签: .net arrays vb.net list


【解决方案1】:

这里的问题是您只需让item 变量指向一个全新的String 对象。

改为这样做,它会做你想做的事:

For i As Integer = 0 To Results.Count - 1
    Results(i) &= "xx"
Next

更新:

如果您想要一个更优雅但仍然有效的解决方案,请考虑在代码中的某处添加以下扩展方法:

Namespace SomeNamespace
    <Microsoft.VisualBasic.HideModuleName()> _
    Public Module SomeModule
        <System.Runtime.CompilerServices.Extension()> _
        Public Sub ForEachIndex(Of T)(ByVal collection As ICollection, ByVal action As Action(Of Integer))
            For i As Integer = 0 To collection.Count
                action(i)
            Next
        End Sub
    End Module
End Namespace

从那时起,如果您在代码中导入 SomeNamespace 命名空间,您将能够做到这一点。

Results.ForEachIndex(Sub(i) Results(i) &= "xx")

这样你既优雅又高效:不会创建新列表,旧字符串将准备好立即进行垃圾收集。

此外,新创建的 ForEachIndex 扩展将适用于任何 ICollection 实现。 ;)

请注意,您也可以将其设为 IEnumerable 扩展并使用 LINQ 的 Count 扩展来了解您拥有多少元素。这将涵盖更多场景,但在某些情况下,您的里程可能会开始变化。请记住,IEnumerable 实例可能表示未编译的元素序列。

【讨论】:

  • 我在 For Each 块中使用了这个方法,现在得到: Collection was modified;枚举操作可能无法执行。有没有围绕这个问题?
  • @user2643607 不要使用For Each 使用for 作为答案。
  • @user2643607 你能显示你的新代码吗?目前还不清楚你怎么可能会遇到这样的问题。
【解决方案2】:

LINQ 可以帮助您:

Results = Results.Select(Function(x) x & "xx").ToList

【讨论】:

  • 这当然可行,但这意味着在某些时候有两个列表,如果原始列表很大,这可能是一个问题。不过,对于短语法,+1。
  • 这将创建一个新数组,任何对旧数组的引用都不会得到应用的更改。
  • @Magnus 对,但这仍然是内存中加载的两个字符串列表。 ;)
  • +1。比起带索引的 for 循环,更喜欢使用 LINQ。
  • @DouglasBarbin 但是创建一个新列表与修改现有列表不同。
【解决方案3】:

再次,使用 LINQ:

Dim Results As New List(Of String)
Results.Add("Test1")
Results.Add("Test2")
Results.Add("Test3")

Dim result As String = Results.Aggregate(String.Empty, Function(currentItem, nextItem) currentItem & " xx " & nextItem)

您是否正在寻找这样的东西: 打印Test1 xx Test2 xx Test3 xx

编辑:

我误解了你在问什么。 Neolisk 有一个正确的答案。 以下是其他几种写法:

Result = Result.Select(Function(x) String.Format("{0} xx", x)).ToLisT()

或者

Result = (From x In Result
          Select x & " xx").ToList()

或者

Result = (From x In Result
          Select String.Format("{0} xx", x).ToList()

【讨论】:

  • 是的,我想连接到结果列表中的元素。所以它会显示为:(0) = "Test1 xx", etc
  • 那么,在这种情况下,Neolisk 有正确的答案。 Crono 也有正确的答案,但 Neolisk 有一个更优雅的 IMO 解决方案。
【解决方案4】:

为什么在将列表转换为数组后不使用 Join 函数?

例如

dim newlist=yourlist.toarray

dim newstring=Join("yourstring",newlist)

【讨论】:

  • 因为OP不需要join,即3行必须保持为3行。
  • 那么也许我理解错了这个问题。所以他想为每个列表项添加一个字符串对吗?
  • 是的,为每个列表元素添加一个常量值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 2015-09-04
  • 2012-10-27
  • 1970-01-01
  • 2020-05-17
  • 2020-11-22
  • 2023-01-12
相关资源
最近更新 更多