如何解决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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。