List <t>中的字符串搜索具有高性能</t>

时间:2013-09-23 10:31:36

标签: c# performance linq

我有一个50000+字符串列表,平均长度约为1000个字符。我可以这样做一个简单的查询:

data.Where(c => c.Contains(query));

但我的猜测是,这不是性能方面的最佳方式。在尝试提高搜索性能时,你的诉求是什么?

我尝试过的事情:

/*** Worst ***/
var result = new List<string>();
foreach (var row in data)
{
    if (row.Contains(query))
        result.Add()
}

/*** Medium ***/
data.Where(c => c.IndexOf(query) != -1);

/*** Best but not that great ***/
data.Where(c => c.Contains(query));

2 个答案:

答案 0 :(得分:2)

脱离我的头脑:您可以使用PLINQ来改善搜索响应时间(如果您的计算机是多核的)

var result = data.AsParallel()
    .Where(c => c.Contains(query));

除此之外,正如 @Tim Schmelter 指出的那样,你应该使用数据库表。

答案 1 :(得分:0)

如果您有能力使用数据库 - 请使用它。他们非常擅长快速查询。

如果您不能并且需要在内存中执行此操作,则可以使用任何快速字符串搜索算法在长字符串中查找短字符串。根据您的需要,这里有两个建议:

  • Knuth-Morris-Pratt(C# implementation) - 在许多“字符串数据库”中重复查找相同字符串时非常有用
  • 后缀树(C# implementation) - 在同一个“字符串数据库”中多次搜索不同字符串时很有用

这些算法中的任何一个对于在长字符串S中查找短字符串P都很有用。它们的效率根据变化和静态变化而变化。

在您的情况下,您有一个字符串列表而不是长字符串。但是,在字符串列表中进行搜索的问题很容易转换为通过将所有字符串连接起来并通过任何未使用的特殊字符进行分隔来搜索长字符串的问题。

例如,如果我想在字符串列表[“Hello”,“World”,“Forty two”]中查找字符串P,那么我将创建一个长字符串“Hello $ World $ Forty two”(其中$是我的特殊分隔符)并在这个长字符串中查找P.