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