2017-10-09 50 views
2

我想拆分字符串而不使用String.Split方法。
我發現了一個可能的解決方案here。我使用的代碼來自第二個答案。
這是我的代碼:不使用String.Split方法拆分字符串不會返回正確的結果

public string[] SplitString(string input, char delimiter) 
{ 
    List<String> parts = new List<String>(); 
    StringBuilder buff = new StringBuilder(); 

    for (int i = 0; i < input.Length; i++) 
    { 
     if (input[i] == delimiter) 
     { 
      parts.Add(buff.ToString()); 
      buff.Clear(); 
     } 
     else 
     { 
      buff.Append(input[i]); 
     } 
    } 
    return parts.ToArray(); 
} 

我在這裏的問題是,當我試圖將一個字符串分解這樣
狗貓汽車人通過「」,結果包含單詞沒有最後一個(在這個例子中 - )。
如果在最後一個單詞後有一個空格,結果是正確的。

我嘗試添加像我== input.Length當for循環是從0到我< = input.Length。但結果仍然沒有硬道理。
我錯過了什麼嗎?

+2

您應該檢查for循環結束時buffer是否爲空。如果它是空的,則完成,或者仍有最後一組字符。 – praty

+1

循環檢查緩衝區長度。如果它多於0,則將其添加到列表中。 –

回答

4

退出循環後再添加parts.Add(buff.ToString()); - 將最後一個單詞刷入集合中。您可以在做這件事之前檢查長度,或者不要評論和解釋爲什麼通過@hvd。

if(buff.Length != 0) 
{ 
    parts.Add(buff.ToString()); 
} 
return parts.ToArray(); 

另一種方法,而是採用一個StringBuilder是:

public static string[] SplitString(string input, char delimiter) 
{ 
    List<String> parts = new List<String>(); 
    int start = 0; 
    for(int i = 0; i < input.Length; i++) 
    { 
     if(input[i] == delimiter) 
     { 
      parts.Add(input.Substring(start, i - start)); 
      start = i + 1; 
     } 
    } 
    parts.Add(input.Substring(start, input.Length - start)); 
    return parts.ToArray(); 
} 

或者使用yield return並返回IEnumerable<string>

public static IEnumerable<string> SplitString(string input, char delimiter) 
{ 
    int start = 0; 
    for(int i = 0; i < input.Length; i++) 
    { 
     if(input[i] == delimiter) 
     { 
      yield return input.Substring(start, i - start); 
      start = i + 1; 
     } 
    } 
    yield return input.Substring(start, input.Length - start); 
} 
+2

「在此之前請確保緩衝區不是空的」 - 不,不檢查。如果存在前導空格或連續內部空格,則OP會在結果中獲得空字符串,但爲了保持一致性,如果存在尾隨空格,則OP還應該獲得空字符串。 – hvd

0

這裏是你在錯過了什麼你for循環後的代碼:

for (int i = 0; i < input.Length; i++) 
    { 
     if (input[i] == delimiter) 
     { 
      parts.Add(buff.ToString()); 
      buff.Clear(); 
     } 
     else 
     { 
      buff.Append(input[i]); 
     } 
    } 

    // This you need to add 
    if (!string.IsNullOrEmpty(buff.ToString())) 
    { 
     parts.Add(buff.ToString()); 
    } 

    return parts.ToArray(); 
相關問題