Класс string
является неизменным (хотя и ссылочным типом), поэтому все его статические методы предназначены для возврата переменной new string
. Вызов someString.Replace
без присвоения ему чего-либо не повлияет на вашу программу. - Похоже, вы исправили эту проблему.
Основная проблема с вашим предложенным алгоритмом заключается в том, что он многократно присваивает много новых string
переменных, что может привести к значительному снижению производительности. LINQ не очень помогает здесь. (На мой взгляд, я не делаю код значительно короче и, конечно, не более читабельным.)
Попробуйте следующий метод расширения. Ключом является использование StringBuilder
, что означает, что для выполнения во время выполнения назначается только один блок памяти.
private static readonly HashSet<char> badChars =
new HashSet<char> { '!', '@', '#', '$', '%', '_' };
public static string CleanString(this string str)
{
var result = new StringBuilder(str.Length);
for (int i = 0; i < str.Length; i++)
{
if (!badChars.Contains(str[i]))
result.Append(str[i]);
}
return result.ToString();
}
Этот алгоритм также использует класс .NET 3.5 'HashSet', чтобы дать O(1)
время поиска для обнаружения плохого символа. Это делает общий алгоритм O(n)
вместо O(nm)
вашего опубликованного (m
- количество плохих символов); это также намного лучше с использованием памяти, как объяснено выше.