我有一个二维的对象数组(主要是,但不只是字符串),我想用一个字符串来过滤它( sSearch )使用LINQ。下面的查询工作正常,但速度不如我想要的快。
sSearch
我变了 Count 到 Any 这导致了速度的显著提高并取代了 Contains 通过忽略大小写的正则表达式,从而消除对 ToLower . 加上这一点,执行时间减少了一半以上。
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())));
在这种情况下,数据集有大约10000行和50列,但是大小可能会有相当大的变化。
关于如何优化这一点的任何建议都将非常感谢。
一个优化是使用 Any 而不是 Count -这样,只要找到一个匹配列,就可以返回该行。
rawData.Where(row => row.Any(column => column.ToString() .ToLower().Contains(sSearch)))
你也应该知道 ToLower 对文化敏感。如果不是你的问题,但值得注意。 ToLowerInvariant 可以 对你来说是个更好的选择。很遗憾没有超载 Contains 它允许您指定要进行不区分大小写的匹配…
ToLowerInvariant
编辑:您现在使用的是正则表达式-是否尝试过 RegexOptions.Compiled ?这可能有帮助,也可能没有帮助…
RegexOptions.Compiled