C# 使用搜索词查找数据的更快方法?
我需要搜索一个字符串数组来查找“Parameters Table”的每个匹配项,在每个“Parameters Table”和下一个“Parameters Table”之间,从指定的索引(保持不变)中获取另一个字符串。我一直这样做:C# 使用搜索词查找数据的更快方法?,c#,visual-studio-2010,list,methods,arrays,C#,Visual Studio 2010,List,Methods,Arrays,我需要搜索一个字符串数组来查找“Parameters Table”的每个匹配项,在每个“Parameters Table”和下一个“Parameters Table”之间,从指定的索引(保持不变)中获取另一个字符串。我一直这样做: public List<string> findlistOfNames(string[] arrayToLookForNames) { List<string> listOfNames = new List<string>(
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;
}
公共列表findlistOfNames(字符串[]arrayToLookForNames)
{
List listOfNames=新列表();
const string separator=“Parameters Table”;//这是我正在搜索的字符串
var cuttedWords=arrayToLookForNames.SkipWhile(x=>x!=分隔符).Skip(1);
while(cuttedWords.Any())
{
var变量=cuttedWords.TakeWhile(x=>x!=分隔符).ToArray();
cuttedWords=cuttedWords.Skip(variable.Length+1);
listOfNames.Add(变量[2]);//需要将此(始终为索引2)添加到列表中
}
返回名称列表;
}
这个速度很慢。有更好的方法吗
编辑:下面是字符串[]arrayToLookForNames
的一段代码:
参数表
0
41
气压
hPa
AFD2
记录
参数表
0
42
气压设定
汞柱
鉴于您尚未指定在以下情况下会发生什么: Parameters TableewfihweifhweParameters TableihwefwihewfParameters Table
看起来您的代码a)目前运行正常,b)您正在寻求改进。一般来说,这些问题对这个网站来说太过武断,但你可能会在网站上找到更好的运气。事实就是这样。我会查出来的,谢谢。在你的帖子之前(如果你这样做的话),至少添加一个你正在传递到函数中的数据的例子。使用
Take
/Skip
/TaksWhile
/SkipWhile
会使整个过程变得非常低效。您应该改用indexer access。这个问题似乎与主题无关,因为它被交叉发布在ArrayTookForNames中。如果您是这样问的,ArrayTookForNames中将多次出现“Parameters Table”?@user2340818在这种情况下,您的问题没有正确指定。。。我上面例子中的匹配是什么?啊,我看到了问题。请参阅我的操作中的编辑。编辑中的示例将返回名称列表,其中包含:巴罗压力,巴罗压力Setting@user2340818:我真的不明白,但我提供了一个可能对您有用的变体。
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);
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);