C#中检查字符串是否为子字符串的最快方法是什么?

3

我需要检查一组项目是否包含一个字符串……就像当用户在搜索框中输入时,列表会被过滤掉。因此,在文本更改事件上,我会检查输入的文本是否包含在列表框项之一中,并进行过滤……就像这样:

value.Contains(enteredText)

我想知道这是否是过滤列表框项目的最快和最有效的方法?

Contains() 方法是在C#中搜索子字符串的最佳方法吗?


7
它可能不是最快或最有效的方法,但很容易理解,可能不会标记任何性能瓶颈,只需要用10秒钟编码,而我理解它甚至更短时间 :-P - Adam Houldsworth
这是非常正确的...我花了一分钟编写它..但我注意到用户输入时有轻微的延迟,所以想知道也许正则表达式会更快。我不知道... - user1202434
1
如果有其他方法比这个更好,那么你不认为那就是实现该方法的最佳选择吗? - Servy
@user1202434 这是一个非常公正的问题,我不想妨碍得到明智回答。我的目的只是通过说明性能并不是衡量代码的唯一标准来为读者增加额外价值。值得注意的是,在回答中加入你稍微延迟的时间,或者可能有关于被比较字符串的数量或字符串的大致大小的细节信息。 - Adam Houldsworth
@user1202434 你需要进行性能分析以找到延迟的确切来源。在此之前,如果没有理由更改完美的代码,你将浪费时间。 - RB.
3个回答

4

我认为除非是非常特殊的情况,否则它足够快速和高效,即使在这种特殊情况下,这可能仅仅是一个纯理论上的问题。如果您使用它并遇到与此相关的逻辑瓶颈,那么我会感到惊讶,但仅在这种情况下才值得查看,那么您可能会寻找其他解决方法。


1

Contains 是我 代码自动补全过滤算法(第6部分#6,其中#7和脚注中描述的模糊逻辑匹配要显著昂贵得多)中最便宜的方法之一,即使是在快速打字用户和下拉菜单中有成千上万个项目的情况下,也不会出现问题

我非常怀疑它会给你带来问题。


1

虽然这不是全球最快的选项,但对于不需要编写任何代码的最快选项。它应该足以过滤下拉列表项。

对于较长的文本,您可能需要选择 KMP算法,其具有线性时间复杂度。但请注意,对于非常短的搜索字符串,它不会有任何区别。

对于具有大量匹配项的搜索(例如您在前一两个字符中获得的搜索),您可能希望预计算一个表,将单个字母和字母对映射到您下拉列表中的行,以便更快地查找,代价是使用更多内存(这是一种通常的编程折衷解决方案)。


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