#c_sharp
Можно ли написать как то компактнее данный фрагмент кода или нет? string newString = oldString.Replace(" ","") .Replace(" ", "") .Replace("-", "") .Replace(".", "") .Replace(",", "") .Replace("(", "") .Replace(")", "") .Replace("{", "") .Replace("}", "") .Replace("[", "") .Replace("]", "") .Replace("!", "") .Replace("@", "") .Replace("#", "") .Replace("$", "") .Replace("%", "") .Replace("^", "") .Replace("*", "") .Replace("+", "") .Replace("=", "") .Replace(":", "") .Replace(";", "") .Replace("/", "") .Replace(@"\", "");
Ответы
Ответ 1
Можно воспользоваться Regex.Replace - в указанной входной строке заменяет все строки, соответствующие шаблону регулярного выражения, указанной строкой замены. string input = "This @#$[ываыв] %is text with some test data %$ dsffs !@#$%"; string pattern = "[-.,(){}@#$%^&*!+=:;/\\[\\]]+"; string replacement = ""; Regex rgx = new Regex(pattern); string result = rgx.Replace(input, replacement); // This @#$[ываыв] %is text with some test data %$ dsffs !@#$% Console.WriteLine("Original String: {0}", input); // This ываыв is text with some test data dsffs Console.WriteLine("Replacement String: {0}", result); http://ideone.com/CVYgJG Я не знаток регулярок, но как пример, думаю, это поможет найти правильный путь.Ответ 2
Как вам и советовали выше, воспользуйтесь регуляркой. Проблема вашего кода не только в его многословности и дублировании, но ещё и в том, что при каждом вызове Replace строка создаётся заново (в силу неизменяемости строк в C#). Поэтому если строки достаточно большие и/или этот код будет вызываться много раз, вы рискуете получить существенный оверхед на многократное пересоздание вашей строки. Не берусь судить, что там происходит в недрах Regex.Replace, но наверняка его алгоритм подходит к этому вопросу существенно экономнее, нежели многократный вызов Replace с пересозданием строки.Ответ 3
Если количество вызовов и/или размеры строк достаточно велики, то рекомендую следующий метод, который существенно (в несколько раз) выигрывает по скорострельности у Regex: private static string ClearString(string s) { StringBuilder sb = new StringBuilder(s.Length); foreach (char c in s) { switch (c) { case ' ': case '\t': case '-': case '+': case '=': case '.': case ',': case ':': case ';': case '(': case ')': case '{': case '}': case '[': case ']': case '!': case '@': case '#': case '$': case '%': case '^': case '&': case '*': case '\\': case '/': break; default: sb.Append(c); break; } } return sb.ToString(); } Компактностью тут, конечно, и не пахнет, но эффективность достойная.
Комментариев нет:
Отправить комментарий