Подтвердить что ты не робот

Заменить несколько строковых элементов в С#

Есть ли лучший способ сделать это...

MyString.Trim().Replace("&", "and").Replace(",", "").Replace("  ", " ")
         .Replace(" ", "-").Replace("'", "").Replace("/", "").ToLower();

Я расширил класс строк, чтобы не допустить его до одного задания, но есть ли более быстрый способ?

public static class StringExtension
{
    public static string clean(this string s)
    {
        return s.Replace("&", "and").Replace(",", "").Replace("  ", " ")
                .Replace(" ", "-").Replace("'", "").Replace(".", "")
                .Replace("eacute;", "é").ToLower();
    }
}

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

https://gist.github.com/ChrisMcKee/5937656

Параметр regex ужасно оценивается; выбор словаря самый быстрый; версия с длинной намоткой заменителя струн немного быстрее, чем короткая.

4b9b3361

Ответ 1

Быстрее - нет. Более эффективно - да, если вы будете использовать класс StringBuilder. С вашей реализацией каждая операция генерирует копию строки, которая при обстоятельствах может ухудшить производительность. Строки являются неизменяемыми объектами, поэтому каждая операция просто возвращает измененную копию.

Если вы ожидаете, что этот метод будет активно вызываться с большим количеством Strings значительной длины, может быть лучше "перенести" его реализацию на класс StringBuilder. При этом любая модификация выполняется непосредственно на этом экземпляре, поэтому вы производите ненужные операции копирования.

public static class StringExtention
{
    public static string clean(this string s)
    {
        StringBuilder sb = new StringBuilder (s);

        sb.Replace("&", "and");
        sb.Replace(",", "");
        sb.Replace("  ", " ");
        sb.Replace(" ", "-");
        sb.Replace("'", "");
        sb.Replace(".", "");
        sb.Replace("eacute;", "é");

        return sb.ToString().ToLower();
    }
}

Ответ 2

Может быть, немного читаем?

    public static class StringExtension {

        private static Dictionary<string, string> _replacements = new Dictionary<string, string>();

        static StringExtension() {
            _replacements["&"] = "and";
            _replacements[","] = "";
            _replacements["  "] = " ";
            // etc...
        }

        public static string clean(this string s) {
            foreach (string to_replace in _replacements.Keys) {
                s = s.Replace(to_replace, _replacements[to_replace]);
            }
            return s;
        }
    }

Также добавьте предложение New In Town о StringBuilder...

Ответ 3

это будет более эффективно:

public static class StringExtension
{
    public static string clean(this string s)
    {
        return new StringBuilder(s)
              .Replace("&", "and")
              .Replace(",", "")
              .Replace("  ", " ")
              .Replace(" ", "-")
              .Replace("'", "")
              .Replace(".", "")
              .Replace("eacute;", "é")
              .ToString()
              .ToLower();
    }
}

Ответ 4

Если вы просто после красивого решения и не нуждаетесь в сохранении нескольких наносекунд, как насчет какого-то LINQ сахара?

var input = "test1test2test3";
var replacements = new Dictionary<string, string> { { "1", "*" }, { "2", "_" }, { "3", "&" } };

var output = replacements.Aggregate(input, (current, replacement) => current.Replace(replacement.Key, replacement.Value));

Ответ 5

В предлагаемых решениях может быть оптимизировано одно. Имея много вызовов Replace(), код выполняет несколько проходов по одной и той же строке. С очень длинными строками решения могут быть медленными из-за недостатков пропускной способности процессора. Может быть, следует рассмотреть замену нескольких строк за один проход.

Ответ 6

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

Изменить: вы можете использовать Dictionary<Key,List<Values>>, чтобы получить тот же результат, что и строка [] []

Ответ 7

Другим вариантом использования linq является

[TestMethod]
public void Test()
{
  var input = "it worth a lot of money, if you can find a buyer.";
  var expected = "its worth a lot of money if you can find a buyer";
  var removeList = new string[] { ".", ",", "'" };
  var result = input;

  removeList.ToList().ForEach(o => result = result.Replace(o, string.Empty));

  Assert.AreEqual(expected, result);
}

Ответ 8

string input = "it worth a lot of money, if you can find a buyer.";
for (dynamic i = 0, repl = new string[,] { { "'", "''" }, { "money", "$" }, { "find", "locate" } }; i < repl.Length / 2; i++) {
    input = input.Replace(repl[i, 0], repl[i, 1]);
}