我有一个二维对象数组(主要是,但不是唯一的字符串),我希望使用LINQ按字符串(sSearch
)进行过滤。以下查询有效,但速度不如我想的那么快。
我已将Count
更改为Any
,这导致速度显着提高,并将Contains
替换为忽略大小写的正则表达式,从而消除对{{1}的调用}。结合这使得执行时间缩短了一半。
现在非常值得注意的是,将搜索项的长度从1增加到2个字母会使执行时间增加三倍,并且还会有另外一个从3到4个字母的跳转(执行时间增加约50%)。虽然这显然不足为奇但我想知道是否还有其他方法可以优化字符串的匹配?
ToLower
在这种情况下,数据集有大约10k行和50列,但大小可能会有很大差异。
非常感谢任何关于如何优化这一点的建议。
答案 0 :(得分:5)
一种优化是使用Any
而不是Count
- 只要找到一个匹配的列,就可以返回该行。
rawData.Where(row => row.Any(column => column.ToString()
.ToLower().Contains(sSearch)))
您还应该知道ToLower
对文化很敏感。如果你的情况可能不是问题,但值得注意。 ToLowerInvariant
可能对您来说是更好的选择。遗憾的是Contains
没有重载,它允许你指定你想要一个不区分大小写的匹配......
RegexOptions.Compiled
吗?它可能有帮助也可能没有帮助......