-1

姐姐,哥们,程序员,大师。

根据搜索元素的运行时间,很多文章建议使用 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 + " ");
        }
    }
}  

}

如果我使用输入表单文件需要很长时间。

在名词列表(90963 字)示例中:



铅笔
等...

我想使用此代码根据字符串值执行搜索。因为我不熟悉。让我通过你的例子来学习。我只是业余的。:) :) :) 非常感谢。干杯...

4

2 回答 2

0
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();

HashSet 的查找速度非常快。这里有一些有趣的测试。

http://theburningmonk.com/2011/03/hashset-vs-list-vs-dictionary/

于 2013-03-13T03:17:39.033 回答
0

试试这个。这可能会帮助你。

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;
}
于 2013-03-13T05:29:49.017 回答