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

Streamwriter: write two listboxes on the same row

我正在尝试编写,以便在 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

我收到以下错误:

BC30452 Operator 'And' is not defined for types 'ListBox.ObjectCollection' and 'ListBox.ObjectCollection'.

我也尝试执行三个 For Each loops,第一个用于 LB1,第二个用于逗号,第三个用于 LB2,但我将其导出为单行内容。我该如何解决这个问题?

如错误消息所述,您尝试使用的语法根本无效。 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), Function(x1, x2) x1 & ", " & x2)
        writer.WriteLine(o)
    Next
End Using

如果您按照另一个答案中的建议使用 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。如果可能有不同的计数,但你想输出所有项目,那么处理它的代码会变得稍微复杂一些。

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

我使用了 StringBuilder 所以代码不必在每次迭代时丢弃并创建一个新字符串。

我使用了由字符串前面的 $ 指示的内插字符串。这意味着我可以在大括号中插入变量,连同文字。

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

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