C# 3.0(使用 LINQ)
这是我的解决方案。它利用 LINQ/扩展方法的一些非常好的特性来保持代码简短。
public static Dictionary<string, int> GetKeywords(string text, int minCount, int minLength)
{
var commonWords = new string[] { "and", "is", "the", "as", "of", "to", "or", "in",
"for", "by", "an", "be", "may", "has", "can", "its"};
var words = Regex.Replace(text.ToLower(), @"[,.?\/;:\(\)]", string.Empty).Split(' ');
var occurrences = words.Distinct().Except(commonWords).Select(w =>
new { Word = w, Count = words.Count(s => s == w) });
return occurrences.Where(wo => wo.Count >= minCount && wo.Word.Length >= minLength)
.ToDictionary(wo => wo.Word, wo => wo.Count);
}
然而,这远非最有效的方法,O(n^2)
使用单词的数量,而不是O(n)
,在这种情况下我相信这是最佳的。我会看看我是否可以创建一个更有效的稍长的方法。
以下是在示例文本上运行的函数的结果(最少出现次数:3,最少长度:2)。
3 x 这样
4 个代码
4 x 其中
4 x 声明
5倍功能
4 x 语句
3 x 新
3 种类型
3 个关键词
7 x 声明
3 种语言
3 x 表达式
3 次执行
3 次编程
4 x 操作员
3 x 变量
还有我的测试程序:
static void Main(string[] args)
{
string sampleText;
using (var client = new WebClient())
sampleText = client.DownloadString("http://sampsonresume.com/labs/c.txt");
var keywords = GetKeywords(sampleText, 3, 2);
foreach (var entry in keywords)
Console.WriteLine("{0} x {1}", entry.Value.ToString().PadLeft(3), entry.Key);
Console.ReadKey(true);
}