C# 当存储在数据结构或长字符串中时,在键值对的键中搜索子字符串更有效?

C# 当存储在数据结构或长字符串中时,在键值对的键中搜索子字符串更有效?,c#,asp.net,data-structures,key-value,C#,Asp.net,Data Structures,Key Value,我有一个字符串搜索问题,我想到了两个关于如何实现它的想法。我想知道人们是否能指出哪种方法能给我带来更高效的性能,或者甚至建议一种更好的方法 问题是我有一个大约450kb的文本文件,其中包含以下格式的数据: description1, code1\n description2, code2\n description3, code3\n ... 它是两列数据,由逗号分隔,每条记录由描述和代码组成 代码是一个短的三个字符的文本,对用户来说没有立即意义,这就是为什么有描述数据与代码配对 描述数据是向

我有一个字符串搜索问题,我想到了两个关于如何实现它的想法。我想知道人们是否能指出哪种方法能给我带来更高效的性能,或者甚至建议一种更好的方法

问题是我有一个大约450kb的文本文件,其中包含以下格式的数据:

description1, code1\n
description2, code2\n
description3, code3\n
...
它是两列数据,由逗号分隔,每条记录由描述和代码组成

代码是一个短的三个字符的文本,对用户来说没有立即意义,这就是为什么有描述数据与代码配对

描述数据是向用户描述代码含义的短句

我正在尝试创建一个GUI,用户可以在其中的可编辑文本字段中输入搜索关键字,然后用于搜索描述数据。然后,系统将返回所有过滤后的记录,即以关键字作为子字符串的所有描述数据以及与之配对的代码,供用户选择。用户键入的每个字符都会出现这种情况

关于如何实现此功能,我想到的第一个想法是使用描述数据作为键创建一个键值对集合,例如
NameValueCollection
,然后使用foreach循环遍历每个记录,并在键中搜索匹配的子字符串

第二种方法是将整个文本文件读入一个长字符串,并使用
string.IndexOf()
方法搜索关键字,只要搜索中有点击,我就提取记录的那部分返回给用户

我想到第二个想法是因为我担心第一个想法可能会对性能产生影响。我已经读到与
StringComparison.Ordinal
一起使用的
IndexOf
方法比Boyer–Moore字符串搜索算法性能更好,所以我认为以这种方式实现它会有更好的性能


因此,当在键中搜索子字符串时,它是否提供了更快的检索来将整个文件存储为字符串或NameValueCollection,或者是否有更好的方法来执行此操作?

如果您有大量字符串,您计划搜索完全相同的子字符串,那么您有很多选择

一个选项是使用在文件的每一行中搜索搜索查询。执行此操作的总运行时间为O(m+n+z),其中m是查询的长度,z是总匹配数,n是文件中所有字符串中的字符总数

一个更好但更复杂的选择是用文件中的所有行构建一个。然后可以在时间O(n+z)中找到所有匹配的行,其中n是要搜索的模式的长度,z是文件中的行总数。这需要O(m)预处理时间,其中m是文件中的字符总数。这比第一个选项快得多,但您可能必须找到一个好的后缀树库,因为后缀树构造算法相当复杂


希望这有帮助

450k真是太小了。你不需要任何花哨的东西。天真的蛮力会在一眨眼之间奏效,真的吗?我在想,我需要一些非常快的东西,因为用户正在启动一个搜索,搜索每一个字符的所有记录。也许我会先测试一下这一点,然后再开始新的方向。在我的机器上,grep foo/usr/share/dict/words的时间为.041s,这就是读取一个910kb的文件。你的搜索速度不会像grep那么快,但是你的内存中已经有了数据。人类的反应时间就在眼前。25s@rrenaud:尽管人类对事物的反应速度不能超过250毫秒,但他们同时或单独检测事件的能力要高得多。虽然将屏幕更新推迟到最后一次击键后半秒可能比每次击键后更新在视觉上更不分散注意力,但即使是100毫秒的延迟也足以让某些东西明显“非即时”。