.net String.Split不会删除拆分文本,只删除第一个字母
这是怎么回事.net String.Split不会删除拆分文本,只删除第一个字母,.net,vb.net,split,.net-4.5,.net,Vb.net,Split,.net 4.5,这是怎么回事 issue.CallAction具有以下值: "Blah blah - WebSite - 9/20/2017 - Containers remaining changed to 0." 在它上面分裂,就像这样: issue.CallAction.Split("Containers remaining changed to ").ToList() 返回多个字符串元素(如本例中所预期的),但这些元素是: Blah-Blah-网站-2017年9月20日- 剩余的容器已更改为0。 据
issue.CallAction
具有以下值:
"Blah blah - WebSite - 9/20/2017 - Containers remaining changed to 0."
在它上面分裂,就像这样:
issue.CallAction.Split("Containers remaining changed to ").ToList()
返回多个字符串元素(如本例中所预期的),但这些元素是:
Blah-Blah-网站-2017年9月20日-
剩余的容器已更改为0。
Split
替换了要拆分的整个字符串,但它只替换了第一个字母
有什么好处
下面是一个编译器对使用字符串分隔符感到满意的屏幕截图。注意没有愤怒的红色扭动:
:它似乎将分隔符视为
字符。至少在Visual Studio 2017/.NET 4.5中,我使用的是C,而且没有
string Split(string separator)
因此,您必须创建一个分隔符数组并填充第一个分隔符
试试这个:
string s = "Blah blah - WebSite - 9/20/2017 - Containers remaining changed to 0.";
string[] separator = { "Containers remaining changed to " };
string[] splitted = s.Split(separator, StringSplitOptions.None);
编辑:
我已经好几年没用VB了,所以我不得不在这里重新学习。这个示例程序的输出告诉我,当调用Char
时,VB悄悄地将字符串
强制为Char
:
Sub PrintAChar(c As Char)
Console.WriteLine("Printing your character: '" + c + "'")
End Sub
Sub Main()
PrintAChar("B") ' Prints 'B'
PrintAChar("Bob Was Here.") ' Also prints 'B'
End Sub
有关最佳实践,请参见下面@Heinzi的重要评论。有趣的是,相同的代码如何既可以是有效的C#又可以是有效的VB.NET,但却产生截然不同的结果?我确实注意到没有尾随分号,但我认为它只是一个复制粘贴工件
使用以下代码
Dim text As String = "Blah blah - WebSite - 9/20/2017 - Containers remaining changed to 0."
Dim list1 As List(Of String) = text.Split("Containers remaining changed to ").ToList()
…IntelliSense表示正在调用重载(包括ParamArray
修饰符)
执行时,列表1包含以下内容:
list1(0) = "Blah blah - WebSite - 9/20/2017 - "
list1(1) = "ontainers remaining changed to 0."
如果您使用这种看似等效的语法编写它
Dim list2 As List(Of String) = text.Split("C", "o", "n", "t", "a", "i", "n", "e", "r", "s", " ", "r", "e", "m", "a", "i", "n", "i", "n", "g", " ", "c", "h", "a", "n", "g", "e", "d", " ", "t", "o", " ").ToList()
Dim list3 As List(Of String) = text.Split("Containers remaining changed to ".ToCharArray()).ToList()
…IntelliSense表示两个.Split()
调用都解析为与上面相同的重载,但是list2
的结果非常不同
list2(0) = "Bl"
list2(1) = ""
list2(2) = ""
list2(3) = "bl"
list2(4) = ""
list2(5) = ""
list2(6) = "-"
list2(7) = "W"
list2(8) = "bS"
list2(9) = ""
list2(10) = ""
list2(11) = ""
list2(12) = "-"
list2(13) = "9/20/2017"
list2(14) = "-"
list2(15) = ""
list2(16) = ""
list2(17) = ""
list2(18) = ""
list2(19) = ""
list2(20) = ""
list2(21) = ""
list2(22) = ""
list2(23) = ""
list2(24) = ""
list2(25) = ""
list2(26) = ""
list2(27) = ""
list2(28) = ""
list2(29) = ""
list2(30) = ""
list2(31) = ""
list2(32) = ""
list2(33) = ""
list2(34) = ""
list2(35) = ""
list2(36) = ""
list2(37) = ""
list2(38) = ""
list2(39) = ""
list2(40) = ""
list2(41) = ""
list2(42) = ""
list2(43) = ""
list2(44) = ""
list2(45) = ""
list2(46) = ""
list2(47) = "0."
…对于列表3也一样。这实际上是我们一直期望的list1
,因为它会在传递的字符串中的任何一个字符上拆分
为什么会这样?这对我来说很有趣,虽然我不是VB.NET的人,所以这可能是常识/陷阱。如果我们看一下,就会发现:
Dim text As String = "Blah blah - WebSite - 9/20/2017 - Containers remaining changed to 0."
Dim arg_13_0 As String = text
Dim expr_0E As Char() = New Char(0) {}
expr_0E(0) = "C"c
Dim list As List(Of String) = arg_13_0.Split(expr_0E).ToList(Of String)()
Dim arg_31_0 As String = text
Dim expr_26 As Char() = New Char(31) {}
RuntimeHelpers.InitializeArray(expr_26, fieldof(<PrivateImplementationDetails>.B46FB904AE74F7001A264BB77882D707B0E9ECC7).FieldHandle)
Dim list2 As List(Of String) = arg_31_0.Split(expr_26).ToList(Of String)()
Dim list3 As List(Of String) = text.Split("Containers remaining changed to ".ToCharArray()).ToList(Of String)()
要获得编译错误,可以打开
要在VB.Net中按字符串拆分,可以使用:
嗯,那。。。作品如果你能找出为什么没有错误,请告诉我。它应该是合适的,因为编译器似乎可以使用字符串而不是数组。谢谢,顺便说一句。为什么没有拆分(字符串分隔符)
一直困扰着我。为什么它似乎在悄悄地将字符串转换为字符,目前仍是个谜。敬请期待。提供更多的上下文可能会有所帮助,因为这些东西在不同的情况下表现不同。这是在.cs
文件中还是代码隐藏?哪个版本的.NET和哪个版本的Visual Studio?.aspx.vb文件.NET 4.5.1,VS 2013Turn选项Strict On
以禁用此和其他恼人的隐式转换。@BobKaufman它没有将其转换为字符
。Split
有一个重载,它接受一个IEnumerable
(这意味着对其中任何一个进行拆分),而String
实现了IEnumerable
,我想它可能以某种方式将String
作为char[]
传递给String.Split(params char[]separator)
重载,但是“Blah Blah-WebSite-9/20/2017-容器剩余更改为0。”.Split(“容器剩余更改为”).ToList();
未能编译,错误为参数1:无法在.NET 4.7上从“string”转换为“char”
。事后看来,string
实现了IEnumerable
,但实现了.tocharray()
将需要使其成为char[]
。这也是我的想法,因为它就是这样运行的。我在.net 4.5.1中(我想我应该标记它)。我想知道这是否是他们在4.7之前错过的事情之一?4.5和4.7之间有一个很大的飞跃。啊哈!你在使用VB.NET。我是用C#编译的。如果我用VB.NET编译,它会成功编译,我看到与你相同的结果。IntelliSense显示,它实际上是在调用参数char[]
重载,这就是为什么它只在第一个字符上分裂。我相信这是一个C#将你推入成功坑(,).Doh,看起来像是的复制品。虽然,他们说他们在那个问题中得到的输出与a)这个问题和B)我在运行他们的代码时得到的输出不一致,所以虽然解决方案相同,但问题可能不同。这样做绝对疯狂。大多数时候,C#和VB是等价的在这里,您不需要知道或关心这些。感谢您提供的详细信息以及编译器代码站点。
Dim list1a As List(Of String) = text.Split("Containers remaining changed to ").ToList()
Dim list1b As List(Of String) = text.Split(CChar("Containers remaining changed to ")).ToList()
Dim list1c As List(Of String) = text.Split("C").ToList()
Dim list1d As List(Of String) = text.Split("C"c).ToList()
Dim result = Split(issue.CallAction, "Containers remaining changed to ")