问题描述
Apple
Pear
Orange
我正在尝试将其放入 List(Of String)
中,但回车符和换行符将其弄乱了。
例如我试试这个:
Dim myNames As List(Of String) = My.Resources.TreeNames.Split(CChar(vbCrLf)).ToList
但是正在传递换行符:
"Apple"
vbLf & "Pear"
vbLf & "Orange"
所以我尝试使用环境变量:
Dim myNames As List(Of String) = My.Resources.TreeNames.Split(CChar(Environment.NewLine)).ToList
但这会导致完全相同的输出。
所以我尝试在换行符上拆分它:
Dim myNames As List(Of String) = My.Resources.TreeNames.Split(CChar(vbLf)).ToList
现在正在传递回车符:
"Apple" & vbCr
"Pear" & vbCr
"Orange"
所以我让它起作用的唯一方法是首先用空替换 vbCr
,然后在 vbLf
的左侧拆分:
Dim myNames As List(Of String) = Replace(My.Resources.TreeNames,vbCr,"").Split(CChar(vbLf)).ToList
谁能解释一下为什么?如果我使用以下命令将文件直接拉入字符串:
Dim myNames as String = My.Resources.TreeNames
我明白了:
"Apple" & vbCrLf & "Pear" & vbCrLf & "Orange"
为什么拆分不能正常工作?
解决方法
查看关于 CChar(<expression>) 的文档:
任何有效的 Char 或 String 表达式; 只有字符串的第一个字符 被转换;值可以是 0 到 65535(无符号)
所以 CChar(vbCrLf)
只返回 VbCr
(\r
- &H0D
)
由于您现在只在 VbCr
上拆分源字符串,因此换行符 VbLf
(\n
- &H0A
) 仍然存在。
您需要接受字符串或字符数组的 String.Split() 重载:
请注意,vbCrLf
是字符串类型,VbCr
和 VbLf
也是如此
Dim res = My.Resources.TreeNames
' As an array of String
Dim myNames = res.Split({vbCrLf},StringSplitOptions.RemoveEmptyEntries).ToList()
'Or
Dim myNames = res.Split({vbCr,VbLf},StringSplitOptions.RemoveEmptyEntries).ToList()
或者作为字符数组:
Dim myNames = res.Split(vbCrLf.ToCharArray(),StringSplitOptions.RemoveEmptyEntries).ToList()
' Or
Dim myNames = res.Split({ChrW(13),ChrW(10)},StringSplitOptions.RemoveEmptyEntries).ToList()
StringSplitOptions.RemoveEmptyEntries 用于删除通过拆分多个连续字符产生的空行。
如果没有它,使用您的示例字符串 - 由回车符 + 换行符分隔的 3 个项目 - 您将获得一个包含 5 个元素而不是 3 个元素的数组,其中包括 2 个空元素。
我不建议使用 VB 常量。相反,您应该使用 Environment.NewLine 属性:https://docs.microsoft.com/en-us/dotnet/api/system.environment.newline
根据文档:
NewLine 的属性值是一个专门定制的常量 .NET Framework 的当前平台和实现。
用法:
Dim myNames = My.Resources.TreeNames.Split(Environment.NewLine)
,
当然,您可以完全跳过 .Split 而只是
Dim LinesList = File.ReadAllLines("txtFruit.txt").ToList
将 Option Infer 保持在 LinesList 上,您将看到它是一个强类型的 List(Of String)