在字典中搜索单词C#

时间:2015-08-13 11:23:03

标签: c# search dictionary

我有一个文本文件,其中包含大约150000个单词的列表。我将这些单词加载到字典中,单词查找对我来说很好。现在我想搜索字典以查看字典是否包含从特定字母开始的单词。

我正在使用

foreach(KeyValuePair pair in dict ){

}

为此目的。这似乎适用于较小的单词列表。但它不适用于150000单词列表。任何人都可以帮忙。

void WordAvailable(char sLetter)     {

    notAvail = true;

    int count = 0;
    do {
        foreach (KeyValuePair<string,string> pair in dict) {

            randWord = pair.Value;
            count++;

            if (randWord [0] == sLetter && !ListTest.usedWordsList.Contains (randWord)) {

                notAvail = false;
                startingLetter = char.ToString (sLetter);
                break;

            }

            if (count >= dict.Count) {

                ChooseRandomAlpha ();
                sLetter = alpha;
                count = 0;
            }

        }

    } while(notAvail);

}

1 个答案:

答案 0 :(得分:2)

  

现在我想搜索字典以查看字典是否包含从特定字母开始的单词。

听起来你想要一个SortedSet而不是Dictionary。您可以使用GetViewBetween查找集合中位于两个边界之间的所有条目。下限可能是&#34;你以&#34;开头的字符串。对于上限,你可以找出&#34;从这些字符开始的最后一个可能的字符串&#34;或者使用独占上限,手动忽略任何不以您的前缀开头的内容,并且&#34;递增&#34;你的前缀的最后一个字符。例如,要查找以&#34; tim&#34;开头的所有单词。您可以使用GetViewBetween("tim", "tin")并忽略tin字典中的GetViewBetween

请注意,订购可能是一个有趣的&#34;当涉及到多种文化等时,如果这只是一个学术练习并且您只有ASCII字符,那么您可能希望在将每个单词添加到集合时减小每个单词的大小写,然后使用顺序比较。如果你需要一个文化敏感的排序,你可以轻松地使这个不区分大小写...但是计算前缀的上限将会更加棘手。

使用using System; using System.Collections.Generic; class Test { static void Main() { var words = new SortedSet<string>(StringComparer.Ordinal) { "cat", "dog", "banana", "laptop", "mug", "coffee", "microphone", "water", "stairs", "phone" }; foreach (var word in words.GetViewBetween("d", "n")) { Console.WriteLine(word); } } }

的示例
dog
laptop
microphone
mug

输出:

@protocol P
   -(void)doSomething
@end

@implementation foo <P>
{
    bar b;
}

-(void) init
{
    [b setDelegate: self];
}

-(void)doSomething
{
    synchronized(self)
    {
        ... do stuff with properties of self ...
    }
}

-(void)doSomethingElse
{
    synchronized(self)
    {
        ... do other stuff with properties of self ...
    }
}

-(void)dealloc()
{
    synchronized(self)
    {
       b.delegate = nil;
       ... destroy properties of self ...
    }
}

@end

另一种方法是建立自己的trie实施(或找到现有的实施),但我不知道BCL中有一个。