C # Multi Replace Idea - PullRequest
       25

C # Multi Replace Idea

0 голосов
/ 06 января 2011

Я знаю, что «множественная замена» в C # не является новой концепцией, есть множество решений.Однако я не нашел ни одного элегантного решения, которое бы хорошо сочеталось с Linq to Sql.Мое предложение состоит в том, чтобы создать метод расширения (названный, как вы уже догадались, MultiReplace), который возвращает лямбда-выражение, которое объединяет несколько вызовов Replace.Таким образом, в действительности у вас будет следующее:

x => x.SomeMember.MultiReplace("ABC", "-")

// Which would return a compiled expression equivalent to:

x => x.SomeMember.Replace("A", "-").Replace("B", "-").Replace("C", "-")

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

-Eric

Ответы [ 5 ]

1 голос
/ 06 января 2011

Я не совсем уверен, почему вы хотите делать то, что вы описываете.Однако, если ваша мотивация состоит в том, чтобы сделать более читабельные операторы linq, сгущая некоторую логику фильтрации, я предлагаю заглянуть в шаблон спецификации .

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

Еще несколько примеров шаблона спецификации и Linq-to-SQL

1 голос
/ 06 января 2011

Я не уверен, что должен делать MultiReplace или почему вы хотите смешать его с Linq для Sql. (Все, что действительно работает с Linq для Sql, может быть переведено в SQL, что, я думаю, будет довольно большой работой)

Лучшее решение, которое я могу придумать, - это регулярные выражения. Почему бы не использовать их? Linq to Sql может даже перевести их для вас, поскольку MS SQL поддерживает регулярные выражения.

x => Regex.Replace(x, "A|B|C", "-")
0 голосов
/ 06 января 2011

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

static string MultiReplace(string this CSV, string Orig, string Replacement)
{
    string final = "";
    foreach (string s in CSV.Split(','))
    {
        final += s.Replace(Orig, Replacement);
    }
    return final;
}

Тогда вы можете назвать его без двусмысленности:

x => x.SomeMember.MultiReplace("A,B,C", "-")

Если вы ожидаете, что эти строки будут длиннее 3-4 значения в CSV, вы можете отказаться от объединения в пользу StringBuilder.

0 голосов
/ 06 января 2011

Возможно, не существует метода, который бы это делал, но вы могли бы просто вкладывать вызовы. Или создайте статический метод, который принимает строку и массив, содержащий все ее замены. Другая проблема заключается в том, что вам нужно указать пару (исходную подстроку и ее замену).

Мне никогда не была нужна / нужна такая функция.

0 голосов
/ 06 января 2011

Мне кажется, это ДЕЙСТВИТЕЛЬНО плохая идея, это может быть только из-за вашего примера, но синтаксис, который вы мне перечислили, очень запутанный.

Чтение этого яможно ожидать, что

x => x.SomeMember.MultiReplace("ABC", "-")

Если использовать следующий текст

ABC This Is A Test ABC Application

Вы получите что-то вроде

--- This Is A Test --- Application

Но вы на самом деле говорите, что это будет

--- This Is - Test --- -pplication

Что я считаю проблематичным ....

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

  1. Цепь их сама "myInput" .Replace ("m", "-"). Replace ("t "," - ")
  2. Создать функцию / метод, который принимает ARRAY или список строк для совпадений, а затем заменяющий символ.Облегчение понимания.
...