Эффективный способ проверки строки на наличие других строк и соответствующего изменения строки с использованием C # - PullRequest
0 голосов
/ 11 декабря 2018

Мне нужен метод для эффективного поиска строк по определенным шаблонам и изменения строки на основе найденного шаблона.Сейчас мое решение работает, но я его совсем не устраиваю из-за высокой цикломатической сложности.То, что я получил, выглядит так:

foreach (string test in string[] strings)
{
    if (test.Contains("one")
    {
        test = ExecuteCodeOne(test);
    }
    if (test.Contains("two")
    {
        test = ExecuteCodeTwo(test);
    }
    if (test.Contains("three")
    {
        test = ExecuteCodeThree(test);
    }
    if (test.Contains("four")
    {
        test = ExecuteCodeFour(test);
    }
    if (test.Contains("five")
    {
        test = ExecuteCodeFive(test);
    }
}

Каждый из методов ExecuteCode выполняет разный код, с одной общей чертой: все они вызывают версию test.Replace("some value", "some other value").Как видите, это не выглядит идеально.Я хотел бы изменить это на что-то лучшее.Мой вопрос: есть ли шаблон проектирования, который мне не хватает и который можно использовать для достижения более низкой сложности и, возможно, сокращения времени выполнения?

РЕДАКТИРОВАТЬ: Пример методов ExecuteCode:

private static string ExecuteCodeOne(string test)
{
    return test.Replace("value1", "newValue1");
}

private static string ExecuteCodeTwo(string test)
{
    if (test.Contains("Value2"))
    {
        test = test.Replace(new Regex(@"Regex1").Match(test).Groups[1].Value, "");
        test = test.Replace("Value2", "");
    }
    else if (test.Contains("Value3"))
        test = test.Replace("Value3", "newValue3");

    return test;
}

Итак, закрытые методы делают совершенно разные вещи, включая свои собственные проверки, но на практике всегда приводят к форме String.Replace ().

1 Ответ

0 голосов
/ 11 декабря 2018

Так как все это сделано со многими одиночными блоками "если", я предполагаю, что все случаи могут происходить одновременно.Еще одна вещь, которую следует учитывать, заключается в том, что все функции имеют в основном различную логику, поэтому трудно найти общий язык для ее рефакторинга.

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

 Dictionary<string, Func<string,string>> myDict = new Dictionary<string, Func<string, string>>()
            {
                {"one", ExecuteCodeOne },
                {"two", ExecuteCodeTwo },
                {"three", ExecuteCodeThree },
                {"four", ExecuteCodeFour },
                {"five", ExecuteCodeFive },
            };

Затем вы можете зациклить словарь и применить все варианты:

List<string> toReplaceList = new List<string>();
            List<string> result = new List<string>();
            foreach(string test in toReplaceList)
            {
                string temp = test;
                foreach (KeyValuePair<string, string> kv in myDict)
                {
                    if (temp.Contains(kv.Key))
                        temp = kv.Value(temp);
                }

                result.Add(temp);
            }

Не отлично, но все же лучше.Надеюсь, это поможет.

...