Replace отложенная инициализация

196
19 сентября 2018, 10:20

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

Сейчас имею такой код:

if (str.Contains("${Time}")) str = str.Replace("${Time}", qq());
if (str.Contains("${Sec}")) str = str.Replace("${Sec}", ww());
if (str.Contains("${Min}")) str = str.Replace("${Min}", ee());

Но выглядит он неуклюже, особенно, когда таких замен 50. Каким образом можно сократить запись?

Мне будет достаточно того, что бы не нужно было писать "${Time}" дважды. И повторю, что если заменять нечего, то и метод выполнять не нужно.

Answer 1

Автор, я это имел ввиду:

public class Program
{
    public static String FooReplace(String str, String oldValue, Func<string> fn)
    {
        if (str.Contains(oldValue))
        {
            str = str.Replace(oldValue, fn());
        }
        return str;
    }
    public static String ww()
    {
        return new string("World".Reverse().ToArray());
    }
    public static String ee()
    {
        return "123";
    }
    public static void Main(string[] args)
    {
        string text = "Hello World!";
        Console.WriteLine(text);
        Console.WriteLine();
        text = FooReplace(text, "!", () => "!!!");
        Console.WriteLine(text);
        String world = "World";
        text = FooReplace(text, "{world}", ww);
        Console.WriteLine(text);
        text = FooReplace(text, "Hel", ee);
        Console.WriteLine(text);
    }
}

Консоль:

Hello World!
Hello World!!!
Hello dlroW!!!
123lo dlroW!!!

PS. еще можно немного сократить код, если поместить значения и ссылки на функции в коллекцию (например в словарь), а после перебрать в цикле:

...
String world = "World";
var oldByNewValue = new Dictionary<string, Func<string>>
{
    {"!", () => "!!!"},
    {"{world}", ww},
    {"Hel", ee},
};
foreach (KeyValuePair<string, Func<string>> kvp in oldByNewValue)
{
    text = FooReplace(text, kvp.Key, kvp.Value);
    Console.WriteLine(text);
}
...
Answer 2

В вашем коде Contains бессмысленный, достаточно только Replace. то есть если подстрока содержится, то она будет заменена, если не содержится, то и менять нечего, поэтому вам достаточно просто:

str = str
  .Replace("${Time}", qq());
  .Replace("${Sec}", ww());
  .Replace("${Min}", ee()); 
READ ALSO
Ошибка при добавлении символа

Ошибка при добавлении символа

На форме есть текстбокс, при добавлении в него символа, должен был добавляться спецсимвол, в моём случае "|", но у меня появляется ошибка:

187
Изменение dll и хуки

Изменение dll и хуки

Есть dll с кодом на C#, которая имеет очень много зависимостей, так что у меня не получится декопильнуть, переписать и закомпилить опять в dllКак...

179
Сверить 2 элемента Selenium C#

Сверить 2 элемента Selenium C#

Доброго времени суток!

184
Как правильно построить базу данных при большом количестве опциональных параметров?

Как правильно построить базу данных при большом количестве опциональных параметров?

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

185