我有一个文本文件,其中包含大约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);
}
答案 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中有一个。