2014-02-19 5 views
2

Я видел много ответов о том, как обращаться с редактированием символов внутри строки с помощью C#.Проблема с удалением символов из строки

Однако мне нужен ответ, который учитывает только метод класса string remove (также, чтобы избежать использования строкового редактора).

Это только потому, что я вижу, что проблема с этим конкретным кодом, который, похоже, не избавляет от среднего пробела в телефонном номере. Код также удаляет любой другой символ, который не является числом.

Я до сих пор не смог понять, почему пробелы или два смежных пробела не будут удалены. Я подозреваю, что самозадача одной строки может быть проблемой, но я не уверен.

//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 (также, чтобы избежать использования построителя строк)». Вам ** нужно ** объяснить это требование. Это не имеет смысла для людей, которые могут вам помочь. – spender

+0

OMG, если вы не собираетесь использовать преимущества библиотеки базового класса, почему вы вообще используете C# и .Net? сделайте свое программирование [с бабочками] (http://xkcd.com/378/). –

+0

При удалении, как указано выше, вы изменяете значение индекса 'i'. Вам нужно приспособиться к этому. –

ответ

0

«почему пробелы или два смежных пробела не будут удалены» - потому что все показатели персонажа после i уменьшены на 1, когда вы .Removei.

Прогулка по низу назад - от Length-1 до 0.

4

Попробуйте вычесть 1, когда вы удалите caracter. Потому что, если вы удалите caracter в позиции 5 и i ++, значение i теперь равно 5, а следующий символ не будет найден в цикле. Как это:

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

'enterPhone' должен быть' введенным телефоном' (назначение), иначе цикл будет зависеть. –

+1

Вы правы, я ошибся с переменной. –

1

Игнорирование ваши странные требования:

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

BTW, '\ D' - это то же самое, что и' [^ \ d] '. – wdosanjos

+0

Прохладный. Приветствия ... – spender

+0

Я не понимаю нисходящее движение на этом. – 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, если ответ Regex был изменен, чтобы оптимизировать создание Regex, я смог довести его до 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); 
    } 
} 
Смежные вопросы