2015-09-20 65 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]); 
     }