-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 ワード) の例:

ブック
チェア
鉛筆
etc...

このコードを使用して、文字列値に基づいて検索を実行したいと思います。私はそれに慣れていないので。あなたの例から学びましょう。私はただのアマチュアです。:) :) :) どうもありがとう。乾杯...

4

2 に答える 2

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 に答える
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 に答える