C#中如何更快地进行字符串比较

3

我有一个比较两个文件的程序。运行了Visual Studio分析后发现我的比较时间很长。有没有比这更快的比较两个字符串的方法?(我不能使用并行循环foreach因为它可能会导致错误)。目前我正在使用一个并发字典,但我也可以考虑其他选项。:)

var metapath = new ConcurrentDictionary<string, string>();
foreach(var me in metapath)
{
 if (line.StartsWith(me.Key.ToString()))
 {...}
}

比较时间有多长,它说了吗? - BoltClock
@BoltClock,我的me.key.tostring长度为8个字符,而line的长度在200到1000之间,所有比较大约需要42秒钟。 - user1158903
@romkyns 是的,我认为它需要基于行。 - user1158903
@phoog 对不起,我不明白你的意思:“比较的期望结果是什么?”实际上,我只是检查一个字符串是否以另一个字符串开头,如何才能获得O(m+n)? - user1158903
@phoog,没错,但是一旦他们已经接受了一个答案,他们不太可能重新访问这个问题。 - Ash Burlaczenko
显示剩余8条评论
3个回答

5

首先,从me.Key.ToString()中删除ToString()

接下来,使用序数字符串比较(前提是这不会影响正确性):

line.StartsWith(me.Key, StringComparison.Ordinal);

这是有益的,因为标准字符串比较遵循各种Unicode规则,例如,规范化和非规范化序列必须被视为相等。而Ordinal仅比较原始字符数据,忽略Unicode相等性规则。关于此更详细的内容可以在这里这里找到(后者声称它更快,但没有引用任何数字)。
最后,对代码进行分析。你会惊讶地发现,大部分时间慢的部分并不是你认为的那样。例如,它可能是你将事物添加到字典的部分。

1
你能解释一下为什么这样会有好处吗? - Ash Burlaczenko

1

抱歉,我并不仅仅比较前8个字符。 - user1158903

0

你所说的“比较”并不是很清楚,但如果你不是指“排序”,而是想检查抄袭或其他什么,那么先对行进行哈希处理,再进行比较如何?

这将取决于你的数据集大小,是否有任何好处。大和小是高度主观的术语。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接