在字符串列表中搜索某些字符串的更有效方法?

时间:2018-11-02 16:09:47

标签: c# list mapping

我有一个字符串列表。不能保证这些字符串的数量和顺序。唯一可以确定的是,此列表将至少包含我感兴趣的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 :(得分:1)

一种方法是将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);
    }
}

这样,通过一次目标字符串的一次传递就可以完成所有三个匹配。

答案 1 :(得分:1)

您可以通过创建将字符串映射到各自功能的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循环更难阅读。