使用LINQ优化2维数组的搜索

3
我有一个二维对象数组(主要是字符串),我想使用LINQ按照一个字符串(sSearch)筛选。下面的查询可以工作,但速度不够快。我已将Count更改为Any,这导致速度显着增加,并用忽略大小写的正则表达式替换了Contains,从而消除了对ToLower的调用。联合起来,这减少了执行时间超过一半。现在非常明显的是,将搜索词的长度从1增加到2将使执行时间增加三倍,而从3到4个字符会有另一个跳跃(执行时间增加约50%)。尽管这显然并不令人惊讶,但我想知道是否有其他优化字符串匹配的方法?
Regex rSearch = new Regex(sSearch, RegexOptions.IgnoreCase);
rawData.Where(row => row.Any(column => rSearch.IsMatch(column.ToString())));

在这种情况下,数据集大约有10,000行和50列,但大小可能会有相当大的差异。如何优化此数据集,如果您有任何建议,请不吝赐教。

他们说大写字母比较是经过优化的... - Dykam
你能告诉我们更多关于你的问题(数据的性质,sSearch中的模式...)吗? 我认为我们拥有的元素太少了,无法深入优化... - Roubachof
1个回答

5

一种优化方法是使用Any而不是Count - 这样,一旦找到一个匹配的列,就可以返回行。

rawData.Where(row => row.Any(column => column.ToString()
                                             .ToLower().Contains(sSearch)))

你还需要知道,ToLower 是与文化相关的。在你的情况下可能不是问题,但了解这一点很值得。ToLowerInvariant 可能是更好的选择。很遗憾,没有一个重载版本的Contains可以让你指定你想要的不区分大小写的匹配...
编辑:现在你正在使用正则表达式 - 你尝试过 RegexOptions.Compiled 吗?它可能有帮助,也可能没有...

很棒的答案,几乎将执行时间减少了一半。我知道一定有更适合的方法,而不仅是Count。如果有任何其他优化更新解决方案的想法,那就太好了。 - Nikolas Stephan
我曾尝试过RegexOptions.Compiled,但没有明显的效果。 - Nikolas Stephan
@ Nikolas:很好。这是那种有时有帮助,有时没有的东西。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接