#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(); } Компактностью тут, конечно, и не пахнет, но эффективность достойная.
Комментариев нет:
Отправить комментарий