Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net String.Split不会删除拆分文本,只删除第一个字母_.net_Vb.net_Split_.net 4.5 - Fatal编程技术网

.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 ")