2015-09-20 64 views
2

我正在分割字符串“\ 0”分隔符,并且我收到一个额外的空白项目,我不知道为什么。应该有5个参数,每个参数都以“\ 0”结尾。这里是字符串:分割字符串时获取额外的空白项目

飞溅\ 0 \ 0Message这里\ 01Back \ 0 \ 0

这里是我的代码:

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

这是为什么我得到:

[0] = "Splash" 
[1] = "" 
[2] = "Message here." 
[3] = "1Back" 
[4] = "" 
[5] = "" 

由于位置很重要,我无法在拆分时删除空参数。

该字符串有5个参数/分隔符,但返回6个元素。位置是非常重要的,因为[0]永远是冠军,[1]字幕,[2]的消息,[3]按钮1,[4]按钮2.

这是很容易的,我只是忽略最后的项目,但我想知道为什么它在那里,我做错了什么。

+0

5分隔符表示将会有6个元素。如果你有一个只有一个分隔符的字符串,你会得到2个元素。如果你只想要5个元素,那么删除最后一个分隔符,这是没有必要的。 – Kyle

回答

3

你没有做错什么。没有额外的结果。它正在按照应有的方式工作。

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

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

你有5个切割(5“\ 0”分隔符),所以你最终会有6个子字符串。

如果你不想要最后一个,那么只需删除它。有很多方法可以做到这一点!搜索“从列表中删除最后一个元素”,“从数组中删除最后一个元素”,或者选择您的首选容器类型。

3

使用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)); 
0

指数4和5是“”,因为字符串以两个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); 
+0

你是对的我不需要一个列表,但我不能删除最后两个\ 0's,他们正在关闭第四个参数1Back和第五个参数是一个空字符串 – Jason

+0

拆分不关心,如果字符串与分割字符结束(关闭)。所以你仍然可以做'TrimEnd',你会得到5个项目的数组。 –

1

这是很容易对我来说,只是忽略了最后一个项目,但我想知道为什么它的存在和我在做什么错。

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

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

如果你有一个CSV文件,在第一行有2个逗号,你会认为该文件有3个头,对吗?如果下一行只包含两个逗号,你会发现有三个值,它们都是空字符串。同样,有4个分隔符的行被认为有5个值,并且(在你的例子中)有5个分隔符的行被认为有7个值。

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

如果您希望输入的结果与您将字符串分开的值相同,那么很好:只需忽略最后一项应始终为空的项目。

0

如果你只想要第5名,使用Take(5)?...

 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]); 
     }