【发布时间】:2015-01-07 02:23:49
【问题描述】:
我有一个包含大约 200,000 条记录的 file.txt。
每条记录的格式为 123456-99-Text。 123456 是唯一的帐号,99 是我需要的位置代码(它从 01 变为 99),文本无关紧要。这些帐号按顺序排序,并在每个 ac(111111、111112、111113 等)的文件中使用换行符。
我制作了一个 Visual Studio 文本框和搜索按钮,让某人搜索帐号。帐号实际上是 11 位数字,但只有前 6 位重要。我把它写成字符串actnum = textbox1.text.substring(0,6)
我写了一个foreach (string x in file.readline('file.txt')) 和一个if (x.contains(actnum)) 然后string code = x.substring(8,2)) 声明。
该程序运行良好,但是由于如果有人搜索不存在的帐号或列表底部的数字,则记录太多,因此程序在进入“号码”之前锁定了10秒钟not found” else 语句,或者永远找不到最后一条记录。
我的问题:
阅读二进制搜索我曾尝试过一种但没有取得多大成功。我似乎无法让数组或文件像合法的二进制搜索一样工作。有没有办法从 textbox1 中获取 6 位数的 actnum,将其与 6 位数帐号的数组子字符串进行比较,然后从该特定行中获取子字符串 99 代码?
二分查找会有很大帮助!我可以取 555-555 并将其与记录文件的上半部分或下半部分进行比较,然后继续搜索,直到找到我需要的行,抓住整行,然后将 99 子串出来。我遇到的问题是我似乎无法对文件进行正确的整数转换,因为它同时包含数字和文本,因此我无法正确使用 、= 符号。
对此的任何帮助将不胜感激。我目前拥有的程序实际上可以运行,但有时速度非常慢。
【问题讨论】:
-
继续粘贴您的代码。如果你做错了,有人会编辑帖子来修复它。总之做一个空行,然后将代码块缩进四个空格。
-
您是否尝试将文件加载到内存中并可能从中生成对象表示?
-
@Brandon 这听起来像是一个相当大的列表,已经将所有内容都放入内存,如果它继续变大(正如拥有 11 位帐号所建议的那样),OP 可能会耗尽资源
-
实际上刚刚发布的两个答案总结了我的建议。
-
200,000 应该不是问题,除非你不关心的字符串很大。
标签: c# arrays binary-search