Из любопытства - есть ли более эффективный подход для замены этой строки? - PullRequest
5 голосов
/ 08 февраля 2011

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

private void MyMethod(string Filter)
{
   //need to remove <Filter> and </Filter> case in-sensitive
   var result = Filter.ToLower().Replace("<filter>","");
   result = Filter.ToLower().Replace("</filter>,"");

  ...........................
}

Ответы [ 6 ]

4 голосов
/ 08 февраля 2011

Проверьте этот ответ: Есть ли альтернатива string.Заменить без учета регистра?

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

Но, честно говоря: действительно ли производительность имеет значение? Как часто ты это делаешь? Я не могу видеть, как вы делаете это так часто, что производительность станет проблемой ...

Вы можете попробовать Regex.Replace с заменой без учета регистра. Это не быстрее. Но это без учета регистра.

3 голосов
/ 08 февраля 2011

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

Вы можете использовать регулярное выражение для сопоставления без учета регистра:

string result = Regex.Replace(
  Filter,
  "</?filter>",
  String.Empty,
  RegexOptions.IgnoreCase
);

Другой альтернативой является использование метода IndexOf для поиска строк, поскольку он может выполнять поиск без учета регистра:

string result = Filter;
int index;
while ((index = IndexOf("<filter>", StringComparison.OrdinalIgnoreCase)) != -1) {
   result = result.Remove(index, 8);
}
while ((index = IndexOf("</filter>", StringComparison.OrdinalIgnoreCase)) != -1) {
   result = result.Remove(index, 9);
}
1 голос
/ 08 февраля 2011

Это зависит от нескольких вещей, длины строки фильтра и т. Д.
Так что вам придется измерять.

Но я бы ожидал, что (сингл!) RegEx будет быстрее здесь.

1 голос
/ 08 февраля 2011

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

1 голос
/ 08 февраля 2011

Replace вызовы неуправляемого кода, который реализован на C ++, который, я думаю, будет трудно победить.

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

0 голосов
/ 08 февраля 2011

Если указанный код работает для вас, это будет быстрее:

private void MyMethod(string Filter)
{
   //need to remove <Filter> and </Filter> case in-sensitive
   var result = Filter.ToLower().Replace("</filter>","");

  ...........................
}

, поскольку результат первого оператора игнорируется.

...