2012-07-06 89 views
0

目前我使用它來尋找一個新的字符串,用字典收藏比較如何更快比較的DictionaryEntry值比「的foreach」循環

foreach (DictionaryEntry value in hd)    
{ 
    if (value == newWordIn) 
    { 
     // assign existing word 
    } 
    else 
    { 
     // assign new word into collection 
    } 
} 

HD包含這麼多鍵並循環很長。 任何事情我可以做,使其快速檢查,不要等待檢查字典集合這麼久?

謝謝你的建議。

+0

你的第一個錯誤是使用散列表像列表。改用索引器。 – leppie 2012-07-06 08:24:59

+2

'if(hd.ContainsValue(value))' – paul 2012-07-06 08:29:06

+0

正如我在回答的評論中指出的那樣,你給出的代碼甚至不會編譯(你會比較DictionaryEntry和字符串)。如果你沒有提供準確的代碼,那真的很難提供幫助。此外,您甚至在沒有評論的情況下更改了問題中的代碼,使我的答案的一半顯得怪異。 – 2012-07-06 09:21:13

回答

3

基本上,不 - 如果您嘗試按值查找字典條目,那麼它將始終是O(N)操作。相反,如果您需要這種行爲,您應該創建一個值爲HashSet<T>的值。

(請注意,你真的不應該使用非泛型集合在第一時間將這些天,除非你真的到。)

+0

儘管O(n)對於小的n ..可能比O(1)更快。 – 2012-07-06 08:28:06

+0

@pst:當然 - 但「高清包含這麼多的關鍵,並使循環很長」是在問題。 – 2012-07-06 08:29:18

+0

啊,完全跳過: – 2012-07-06 08:29:54

0

你可以引入額外的詞典中,關鍵是值從原來的字典和值是原始字典中這些值的計數。如果原始字典中的值是唯一的(因此計數總是1),那麼您可以使用HashSet而不是Dictionary

您需要確保兩個結構始終保持同步。

0

您是否還可以包含代碼以顯示您正在使用hdnewWordIn的哪些類型以使示例更清晰?

假設在您的示例中newWordInstring類型,那麼該代碼將不會編譯,因爲您將其與DictionaryEntry類型進行比較。

由於喬恩斯基特已經指出的那樣,你可能需要的是一個HashSet<string>

看起來好像(從你的代碼中的註釋),那是你正在嘗試做的是確保你的集合不包含重複的條目。那麼你的代碼應該是這樣的:

HashSet<string> hd = new HashSet<string>(); 

... 

// Only add distinct entries 
if (!hd.Contains(newWordIn)) 
{ 
    hd.Add(newWordIn); 
}