从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字(示例:

书籍
椅子
铅笔
等等。

我想用这个代码来执行基于字符串值的搜索。因为我不熟悉。让我以你为榜样学习。我只是个业余爱好者非常感谢。干杯

从txt中添加和查找字符串的运行时间太长

试试这个。这可能会对你有所帮助。

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/