Более эффективный метод для поиска списка строк для определенных строк? - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть список строк. Ни количество, ни порядок этих строк не гарантируются. Единственное, что является бесспорным, это то, что этот список будет по крайней мере содержать мои 3 интересующие строки, и внутри этих строк мы скажем, что «string1», «string2» и «string3» будут содержаться в них соответственно (то есть эти строки могут содержат больше информации, но эти ключевые слова обязательно будут там). Затем я хочу использовать эти результаты в функции.

Моя текущая реализация для решения этой проблемы:

foreach(var item in myList)
{
    if (item.Contains("string1"))
    {
        myFunction1(item);
    }
    else if (item.Contains("string2"))
    {
        myFunction2(item);
    }
    else if (item.Contains("string3"))
    {
        myFunction3(item);
    }
}

Есть ли лучший способ проверить списки строк и применить функции к тем элементам, которые соответствуют некоторым критериям?

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

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

Dictionary<string, Action<string>> actions = new Dictionary<string, Action<string>>
{
    ["string1"] = myFunction1,
    ["string2"] = myFunction2,
    ["string3"] = myFunction3
};

foreach (var item in myList)
{
    foreach (var action in actions)
    {
        if (item.Contains(action.Key))
        {
            action.Value(item);
            break;
        }
    }
}

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

0 голосов
/ 02 ноября 2018

Один из подходов - использовать Regex для фиксированного списка строк и проверить, какая группа присутствует, например:

// Note the matching groups around each string
var regex = new Regex("(string1)|(string2)|(string3)");
foreach(var item in myList) {
    var match = regex.Match(item);
    if (!match.Success) {
        continue;
    }
    if (match.Groups[1].Success) {
        myFunction1(item);
    }
    else if (match.Groups[2].Success)
    {
        myFunction2(item);
    }
    else if (match.Groups[3].Success)
    {
        myFunction3(item);
    }
}

Таким образом, все три совпадения будут выполнены за один проход через целевую строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...