词典API(词法)
答
从像ASpell(http://aspell.net/)这样的开源拼写检查器中获取平面文本文件,并将其加载到List或任何您喜欢的结构中。
例如,
List<string> words = System.IO.File.ReadAllText("MyWords.txt").Split(new string[]{Environment.NewLine}).ToList();
// C# 3.0 (LINQ) example:
// get all words of length 5:
from word in words where word.length==5 select word
// get partial matches on "foo"
from word in words where word.Contains("foo") select word
// C# 2.0 example:
// get all words of length 5:
words.FindAll(delegate(string s) { return s.Length == 5; });
// get partial matches on "foo"
words.FindAll(delegate(string s) { return s.Contains("foo"); });
答
您可能想要查找Trie执行。这肯定有助于“以XYZ开头的单词”以及完全匹配。您可能希望将所有数据都放在多个数据结构中,每个数据结构都针对特定任务进行调整 - 例如一个用于anagrams,一个用于“按长度”等。与RAM相比,自然语言字典与RAM相比是相对较小的,所以如果你真的想快速查找,那可能是一条可行的路。
答
我与Barry Fandango在这一个,但你可以做到这一点没有LINQ。 .NET 2.0在List(T)类型上有一些很好的过滤方法。一个我的建议是
List(T).FindAll(Predicate(T)) : List(T)
这种方法将使每一个元素在列表中通过判断方法,并返回返回“真”字的列表。因此,按照建议从开源词典中将您的单词加载到List(字符串)中。为了找到长度为5的所有的话...
List(String) words = LoadFromDictionary();
List(String) fiveLetterWords = words.FindAll(delegate(String word)
{
return word.Length == 5;
});
还是为了以 'ABC' 的所有单词......
List(String) words = LoadFromDictionary();
List(String) abcWords = words.FindAll(delegate(String word)
{
return word.StartsWith('abc');
});
我相信,代码需要C#3.0,并且或者.NET 3.5。 NET 2.0与LINQBridge。在这方面,.NET 3.0没有提供比.NET 2.0更有用的东西。 – 2008-12-03 11:15:36
的确,我已经在3.0中工作了一段时间了,所以我想我已经习惯了在我需要时使用LINQ。编辑为包含非3.0样本。 – 2008-12-03 14:03:33