String.Split() 使用 VbCrLf 不起作用,但首先用 "" 替换 VbCr 然后在 VbLf 上拆分确实有效为什么?

问题描述

我有一个嵌入的文本文件作为资源。内容是:

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 是字符串类型,VbCrVbLf 也是如此

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)