使用搜索词查找数据的更快方法?

时间:2014-06-16 19:35:03

标签: c# visual-studio-2010 list methods arrays

我需要搜索字符串数组以查找“参数表”的每次出现,并在每个“参数表”和下一个之间,从指定的索引中获取另一个字符串(保持不变)。我这样做是这样的:

public List<string> findlistOfNames(string[] arrayToLookForNames)
{
    List<string> listOfNames = new List<string>();

    const string separator = "Parameters Table"; //This is the string I am searching for

    var cuttedWords = arrayToLookForNames.SkipWhile(x => x != separator).Skip(1);

    while (cuttedWords.Any())
    {
        var variable = cuttedWords.TakeWhile(x => x != separator).ToArray();
        cuttedWords = cuttedWords.Skip(variable.Length + 1);
        listOfNames.Add(variable[2]); //This (always index 2) needs to be added to the list
    }
    return listOfNames;
}

这很慢。有更好的方法吗?

编辑:以下是string[] arrayToLookForNames的片段:

  

参数表

     

0

     

41

     

巴罗压力

     

hPa

     

AFD2

     

记录

     

参数表

     

0

     

42

     

Baro Setting

     

在-HG

1 个答案:

答案 0 :(得分:1)

看到你还没有说明以下情况会发生什么:

Parameters TableewfihweifhweParameters TableihwefwihewfParameters Table

总共有3种可能的匹配,我选择假设每个条目只有一个匹配。

您可以使用正则表达式来更简洁地说明这一点。可能比你的方法更有效......

<击>

<击>
var regex = new Regex(@"(?<=Parameters Table).*?(?=(?:Parameters Table)|$)");
IEnumerable<string> foundValues = 
            arrayToLookForNames.SelectMany(x => regex.Matches(x))
                   .Where(m => m.Success)
                   .Select(m => m.Value);

...对于上面的条目,这将产生ewfihweifhwe

以满足您更好的指定要求:

var regex = new Regex(@"(?<=Parameters Table).*?(?=(?:Parameters Table)|$)",
                      RegexOptions.Singleline);
var vals = arrayToLookForNames
               .SelectMany(x=>regex.Matches(x).Cast<Match>())
               .Where(m=>m.Success)
               .Select(m=>m.Value);