代码之家  ›  专栏  ›  技术社区  ›  Nikolas Stephan

用LINQ优化二维阵列的搜索

  •  3
  • Nikolas Stephan  · 技术社区  · 15 年前

    我有一个二维的对象数组(主要是,但不只是字符串),我想用一个字符串来过滤它( sSearch )使用LINQ。下面的查询工作正常,但速度不如我想要的快。

    我变了 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列,但是大小可能会有相当大的变化。

    关于如何优化这一点的任何建议都将非常感谢。

    1 回复  |  直到 15 年前
        1
  •  5
  •   Jon Skeet    15 年前

    一个优化是使用 Any 而不是 Count -这样,只要找到一个匹配列,就可以返回该行。

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

    你也应该知道 ToLower 对文化敏感。如果不是你的问题,但值得注意。 ToLowerInvariant 可以 对你来说是个更好的选择。很遗憾没有超载 Contains 它允许您指定要进行不区分大小写的匹配…

    编辑:您现在使用的是正则表达式-是否尝试过 RegexOptions.Compiled ?这可能有帮助,也可能没有帮助…