分割字符串时获取额外的空白项目

时间:2015-09-20 04:18:12

标签: c#

我正在用“\ 0”分隔符拆分字符串,我得到一个额外的空白尾随项目,我不知道为什么。应该有5个参数,每个参数以“\ 0”结尾。这是字符串:

  

Splash \ 0 \ 0Message here。\ 01Back \ 0 \ 0

这是我的代码:

page.css('span.list-item-title.restaurant-name').each do |line|
 name << line.text.strip
end

这就是我收到的原因:

var paramList = new List<string>(parameters.Split("\0".ToCharArray()));

分割时我无法删除空参数,因为它们的位置很重要。

该字符串有5个参数/分隔符,但返回6个元素。位置很重要,因为[0]始终是标题,[1]是副标题,[2]是消息,[3]按钮1,[4]按钮2。

我很容易忽略最后的项目,但我想知道它为什么存在以及我做错了什么。

5 个答案:

答案 0 :(得分:4)

使用StringSplitOptions.RemoveEmptyEntries删除空条目

替换

var paramList = new List<string>(parameters.Split("\0".ToCharArray()));

var paramList = new List<string>(parameters.Split("\0".ToCharArray(), StringSplitOptions.RemoveEmptyEntries));

要仅跳过最后一个空白项目,请使用

var parameters = "Splash\0\0Message here.\01Back\0\0";
var splitted = parameters.Split("\0".ToCharArray());
var paramList = new List<string>(splitted.Take(splitted.Length - 1));

答案 1 :(得分:3)

你没有做错任何事。没有额外的结果。它完全按照预期工作。

拆分不是为了查找由给定分隔符终止的子串,而是拆分给定分隔符处的子串。

就像切一条面包一样,如果你做了1次切割,你最终会得到2块。 如果你做两次切割,你最终得到3件。 如果你做3次切割,你最终得到4件。 等等...

你有5个剪辑(5&#34; \ 0&#34;分隔符),所以你最终会得到6个子字符串。

如果您不想要最后一个,请将其删除。有很多方法可以做到这一点!搜索&#34;从列表中删除最后一个元素&#34;,&#34;从数组中删除最后一个元素&#34;,或者您首选的容器类型。

答案 2 :(得分:1)

  

我很容易忽略最后的项目,但我想知道它为什么存在以及我做错了什么。

你没有做错任何事。 Split()正在完成它在这种情况下应该做的事情。

"1,2".Split(',') -> ["1", "2"]
",".Split(',')   -> ["", ""]
"1,,".Split(',') -> ["1", "", ""]

如果您的CSV文件在第一行有2个逗号,那么您认为该文件有3个标题,对吧?如果下一行只包含两个逗号,则表示有三个值,并且它们都是空字符串。同样,一个带有4个分隔符的行被认为有5个值,并且(如你的例子中)一个有5个分隔符的行被认为有7个值。

在您的情况下,字符串以'\0'结尾的事实意味着拆分该字符串将在结尾处产生最终的空字符串,这正是您所看到的行为。

如果你希望你的输入以与你分割字符串相同的值结束,那很好:只需忽略最后一项,它应该总是为空。

答案 3 :(得分:0)

索引4和5是&#34;&#34;因为字符串以两个NUL结尾。要删除这些,您可以执行类似

的操作
const char NUL = '\0';
var paramList = new List<string>(parameters.TrimEnd(NUL).Split(NUL));

我不确定你为什么要paramList Liststring.Split返回一个字符串数组,应该没问题。

var params = parameters.TrimEnd(NUL).Split(NUL);

答案 4 :(得分:0)

如果您只想要前五个,请使用 string parameters = @"Splash\0\0Message here.\01Back\0\0"; var paramList = new List<string>(parameters.Split(new string[] { @"\0" }, StringSplitOptions.None).Take(5)); for(int i = 0; i < paramList.Count; i++) { Console.WriteLine(i.ToString() + ": " + paramList[i]); } ?...

body {
    display: flex;
    width: 100%;
}
aside, section{
    flex: 0 1 auto;
    height: 100vh;
    width:50vw;
    -webkit-transition: all 10s linear;
    transition: all 10s linear;
    background-color:red;
}

aside:hover, section:hover {
   width: 100vw;
}

section {background-color:black;}