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