从txt中添加和查找字符串的运行时间太长
本文关键字:运行时间 字符串 查找 txt 添加 | 更新日期: 2023-09-27 18:03:32
姐姐,好友,程序员,大师。
基于搜索元素的运行时间,许多文章建议使用HashSet和List来添加元素。
如何更改或改进我的代码如下:
static List<string> getDBList(string DBname)
{
List<string> listWords = new List<string>();
string[] files;
try
{
files = Directory.GetFiles(@"dbase/", DBname);
foreach (string file in files)
foreach (string line in File.ReadAllLines(file))//doubt
listWords.Add(line.Trim().ToUpperInvariant());
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return new List<string> { };
}
return listWords;
}
然后。。。
//MAIN PROGRAM
string allInput = rtbInput.Text;
List<string> splitString = new List<string>.Split(new char[] { ' ', ''t', etc...});
List<int> AllIndexes = new List<int>();
HashSet<string> nounList = new HashSet<string>(getDBList("nounList.txt"));//doubt
int startIndexes = 0;
foreach (string s in splitString)
{
if (s.Trim() != "")
{
string word = s.Trim();
if(!(nounList.Contains(word.ToUpperInvariant()))) //doubt if not found, color it
{
tbTest.Text += word + " ";
//index to begin color the text
AllIndexes = WordsIndex(word, startIndexes);
foreach (int item in AllIndexes) //Coloring all appearance of the word.
{
tbSeeIndex.Text += Convert.ToString(" " + item + " ");
rtbInput.Select(item, word.Length);
startIndexes = item + word.Length;
rtbInput.SelectionColor = Color.Red;
}
tbL.Text += Convert.ToString(" " + startIndexes + " ");
}
}
}
}
如果我使用输入表单文件,会花费太长时间。
在nounList(90963字(示例:
书籍
椅子
铅笔
等等。
我想用这个代码来执行基于字符串值的搜索。因为我不熟悉。让我以你为榜样学习。我只是个业余爱好者非常感谢。干杯
试试这个。这可能会对你有所帮助。
static Dictionary<int, string> getDBList(string DBname)
{
Dictionary<int, string> WordsDictionary = new Dictionary<int, string>();
string[] files;
try
{
files = Directory.GetFiles(@"dbase/", DBname);
foreach (string file in files)
foreach (string line in File.ReadAllLines(file))
{
string data = line.Trim().ToUpperInvariant();
int hash = data.GetHashCode();
if(!WordsDictionary.ContainsKey(hash))
WordsDictionary.Add(hash, data);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
return new Dictionary<int, string>();
}
return WordsDictionary;
}
static bool SearchText(string text, Dictionary<int, string> WordsDictionary)
{
int hash = text.Trim().ToUpperInvariant().GetHashCode();
if (WordsDictionary.ContainsKey(hash))
return true;
else
return false;
}
var nounDictionary = nounList
.ToDictionary(g => g.Key, g => g.First(), StringComparer.OrdinalIgnoreCase);
这应该会为你创建一本词典。不过,如果没有某种有用的密钥,我不确定这怎么会"更快"。此外,我怀疑你的列表搜索速度是这里的问题。
编辑:
一个更简单的例子如下,它将键映射为数组中的每个项,将值映射为每个项到上。
var nounDictionary = nounList.ToDictionary(x => x.ToUpper());
最后,如果你想以最佳方式搜索你的集合,请使用哈希集,正如其他人所指出的那样。Hashset有一个接受IEnumerable的构造函数,所以只需传入一个字符串列表,因为IList实现了IEnumerable
var set = new HashSet(nounList.ToList());
然后,如果你想搜索你的HashSet,你可以做下面这样的事情,尽管这本身就是一个问题。
set.Where(x => x.Contains("StringToFind"))
.Select(x => x.Split(' ')[0])
.FirstOrDefault();
哈希集的查找速度非常快。这里有一些有趣的测试。
http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/