Streamwriter:在同一行上写入两个列表框

问题描述

为了在txt文件上导出,我试图在行数相同的两个列表框中写入信息。我必须以以下格式导出它们:ListBox1,ListBox2.为此,我尝试使用以下代码

Using writer = New StreamWriter(SaveFileDialog1.FileName)
    For Each o As Object In Form3.ListBox1.Items And Form3.ListBox2.Items
        writer.WriteLine(o)
    Next
End Using

我收到以下错误

未为类型'ListBox.ObjectCollection'和'ListBox.ObjectCollection'定义BC30452运算符'And'。

我还尝试执行三个For Each loops,第一个执行LB1,第二个执行逗号,第三个执行LB2,但是我将其导出并在一行上显示内容。我该怎么解决

解决方法

如果按照另一个答案中的建议使用Enumerable.Zip,则可以通过消除显式循环来使代码更简洁:

File.WriteAllLines(SaveFileDialog1.FileName,Form3.ListBox1.
                         Items.
                         Cast(Of Object).
                         Zip(Form3.ListBox2.
                                   Items.
                                   Cast(Of Object),Function(x1,x2) $"{x1},{x2}"))

如果您不使用Zip,则可以通过以下方式使用循环:

Dim items1 = Form3.ListBox1.Items
Dim items2 = Form3.ListBox2.Items

Using writer = New StreamWriter(SaveFileDialog1.FileName)
    For i = 0 To Math.Min(items1.Count,items2.Count)
        writer.WriteLine($"{items1(i)},{items2(i)}")
    Next
End Using

Math.Min部分是为了防止每个ListBox中有不同数量的项目。如果您知道没有,那么您可以使用一个Count来消除它。如果计数可能不同,但您想输出所有项目,则处理该代码将变得稍微复杂一些。

,

如错误消息所述,您尝试使用的语法完全无效。 VB.NET中没有任何功能可以做到这一点。

但是,.NET Framework API确实为类似的事情提供了一种方法,这种方法可能适合您的情况。参见Enumerable.Zip()。您可以像这样使用它:

Using writer = New StreamWriter(SaveFileDialog1.FileName)
    For Each o As String In Form3.ListBox1.Items.Cast(Of Object).Zip(Form3.ListBox2.Items.Cast(Of Object),x2) x1 & "," & x2)
        writer.WriteLine(o)
    Next
End Using
,

由于您说过两个列表框的项目数量相同,因此我们可以在For循环中使用第一个列表框中的项目数量减去一个(索引从零开始)。

我使用了StringBuilder,因此代码不必在每次迭代时都扔掉并创建新的字符串。

我使用了由字符串前的$表示的内插字符串。这意味着我可以将变量与文字一起放在大括号中。

.ToString上调用StringBuilder以写入文本文件。

Private Sub SaveListBoxes()
    Dim sb As New StringBuilder
    For i = 0 To ListBox1.Items.Count - 1
        sb.AppendLine($"{ListBox1.Items(i)},{ListBox2.Items(i)}")
    Next
    File.WriteAllText("C:\Users\xxx\Desktop\ListBoxText.txt",sb.ToString)
End Sub