0

我有一个 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));
4

2 回答 2

2

我的头顶上:你可以用它PLINQ来提高搜索响应时间(如果你的机器是多核的)

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

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

于 2013-09-23T10:54:06.790 回答
0

如果您负担得起使用数据库 - 使用它。他们非常擅长快速查询。

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

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

这些算法中的任何一种对于在长字符串 S 中查找短字符串 P 都是有用的。它们的效率根据变化和保持不变而变化。

在您的情况下,您有一个字符串列表而不是一个长字符串。但是在字符串列表中搜索的问题很容易转换为在长字符串中搜索的问题,方法是连接所有字符串,并用它们中的任何一个都不使用的特殊字符分隔。

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

于 2013-09-23T11:13:56.493 回答