2009-10-26 127 views
0
class CounterDict<TKey> 
{ 
    public Dictionary<TKey, int> _dict = new Dictionary<TKey, int>(); 

    public void Add(TKey key) 
    { 
     if(_dict.ContainsKey(key)) 
      _dict[key]++; 
     else 
     { 
      _dict.Add(key, 1); 
     } 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     string line = "The woods decay the woods decay and fall."; 

     CounterDict<string> freq = new CounterDict<string>(); 
     foreach (string item in line.Split()) 
     { 
      freq.Add(item.Trim().ToLower()); 
     } 

     foreach (string key in freq._dict.Keys) 
     { 
      Console.WriteLine("{0}:{1}",key,freq._dict[key]); 
     }   
    } 
} 

我想計算一個字符串中所有單詞的出現次數。
我覺得上面的代碼將是緩慢的,在這個任務,因爲(考慮添加功能):如何計算文本文檔中所有單詞的頻率?

if(_dict.ContainsKey(key)) 
    _dict[key]++; 
    else 
    { 
     _dict.Add(key, 1); 
    } 

而且,保持_dict__public好的做法呢? (我不認爲是這樣。)

我應該如何修改或完全改變它來完成這項工作?

回答

4

如何:

Dictionary<string, int> words = new Dictionary<string, int>(); 
string input = "The woods decay the woods decay and fall."; 
foreach (Match word in Regex.Matches(input, @"\w+", RegexOptions.ECMAScript)) 
{ 
    if (!words.ContainsKey(word.Value)) 
    { 
     words.Add(word.Value, 1); 
    } 
    else 
    { 
     words[word.Value]++; 
    } 
} 

主要點是用正則表達式替換.Split,所以你並不需要保存在內存中一個很大的字符串數組,你可以在時間和精力做一件事情。

+0

但是,「非字符串」鍵呢?我計劃將此擴展到其他關鍵類型。 – 2009-10-26 12:08:19

+0

「或者還有非字符串的REGEX? :) – 2009-10-26 12:08:50

+0

你是什麼意思'非字符串'? '\ w +'表示'[a-zA-Z_0-9]'(或'從A到Z的字母,下劃線和數字') – 2009-10-26 12:17:58

2

從MSDN文檔:

// When a program often has to try keys that turn out not to 
    // be in the dictionary, TryGetValue can be a more efficient 
    // way to retrieve values. 
    string value = ""; 
    if (openWith.TryGetValue("tif", out value)) 
    { 
     Console.WriteLine("For key = \"tif\", value = {0}.", value); 
    } 
    else 
    { 
     Console.WriteLine("Key = \"tif\" is not found."); 
    } 

沒有測試它自己,但它可能會提高您的工作效率。

相關問題