2014-02-19 22 views
2

我已經看到很多關於如何處理用c#編輯字符串中的字符的問題。從字符串中刪除字符的問題

但是,我需要一個只考慮使用字符串類方法刪除(也避免使用stringbuilder)的答覆。

這只是讓我可以看到這個特定的代碼是什麼問題,這似乎並沒有擺脫電話號碼中間的空白。該代碼還會刪除任何不是數字的其他字符。

到目前爲止,我一直無法理解爲什麼不會刪除空格或兩個相鄰的空格。我懷疑也許是同一個字符串的自我分配可能是一個問題,但我不確定。

//leave only the digits 
for (int i = 0; i < enteredPhone.Length; i++) 
{ 
    switch (enteredPhone[i]) 
    { 
     case '0': 
     case '1': 
     case '2': 
     case '3': 
     case '4': 
     case '5': 
     case '6': 
     case '7': 
     case '8': 
     case '9': 
      break; 

     default: 
      //gets rid of any other type of character 
      enterPhone = enteredPhone.Remove(i, 1); 
      break; 
     } 
    } 

在此先感謝。

+4

「但是,我需要一個只考慮使用字符串類方法remove(也避免使用stringbuilder)的回覆。」你需要**解釋這個要求。對可能幫助你的人沒有意義。 – spender

+0

OMG,如果你不打算使用基類庫提供的優點,爲什麼你使用C#和.Net呢?繼續做[蝴蝶]的編程(http://xkcd.com/378/)。 –

+0

當你像上面一樣刪除時,你改變你的索引'我'的價值。你需要對此進行調整。 –

回答

0

「爲什麼不刪除空格或兩個相鄰的空格」 - 因爲當您.Removei時,i後的所有字符索引都減1。

向後走字符串 - 從Length-10

4

嘗試在刪除caracter時減去1。因爲如果你刪除位置5和i ++中的字符,我現在的值是5,並且下一個字符將不會被循環找到。就像這樣:

default: 
     //gets rid of any other type of character 
     enterPhone = enteredPhone.Remove(i, 1); 
     i--; 
     break; 
+1

'enterPhone'應該是'enteredPhone'(賦值),否則循環將被卡住。 –

+1

你是對的我拼錯變量。 –

1

忽略你的離奇要求:每次

Regex.Replace(inputString, @"\D", string.Empty) 
+0

順便說一句,'\ D'與'[^ \ d]'相同。 – wdosanjos

+0

很酷。乾杯... – spender

+0

我不明白在這個downvote。 – Andy

2

您的問題是增量指標,即使你已刪除非數字字符。在這種情況下,下一個字符將具有當前索引,但在下一個循環中,您正在遞增當前索引,從而跳過下一個字符。使用while代替for

int index = 0; 
while(index < enteredPhone.Length) 
{ 
    switch (enteredPhone[index]) 
    { 
     case '0': 
     case '1': 
     case '2': 
     case '3': 
     case '4': 
     case '5': 
     case '6': 
     case '7': 
     case '8': 
     case '9': 
      index++; 
      break; 

     default:     
      enteredPhone = enteredPhone.Remove(index, 1); 
      break; 
    } 
} 

您也可以使用Char.IsDigit來簡化這個循環:

int index = 0; 
while(index < enteredPhone.Length) 
{ 
    if (Char.IsDigit(enteredPhone[index])) 
    { 
     index++; 
     continue; 
    } 

    enteredPhone = enteredPhone.Remove(index, 1); 
} 
0
var onlyDigits = new string(enteredPhone.Where(Char.IsDigit).ToArray()); 

應該稍微比正則表達式更高效。

+1

你爲什麼說它應該比正則表達式更有效率? – wdosanjos

+1

@wdosanjos Regex通常是一種非常昂貴的做事方式。我做了一個快速基準,上面的正則表達式的答案比這個答案長9-10倍。 –

+0

@wdosanjos如果正則表達式的答案改變了,以優化正則表達式的創建方式,我可以把它降低到這個答案的速度的6倍。 –

0

你也可以試試。但我相信Linq或Regex解決方案是更好的選擇。

//leave only the digits 
for (int i = enteredPhone.Length - 1; i >= 0; i--) 
{ 
    if (!Char.IsDigit(enteredPhone[i])) 
    { 
     enterPhone = enteredPhone.Remove(i, 1); 
    } 
}