2012-03-27 70 views
1

請看看我的代碼:設定值的DictionaryEntry

IDictionary dictionary = new Hashtable(); 
const string key = "key"; 
const string value = "value"; 
dictionary[key] = null; // set some trigger here 

// set value 
IDictionaryEnumerator dictionaryEnumerator = dictionary.GetEnumerator(); 
while (dictionaryEnumerator.MoveNext()) 
{ 
    DictionaryEntry entry = dictionaryEnumerator.Entry; 
    if (entry.Value == null) // some business logic check; check for null value here 
    { 
     entry.Value = value; // set new value here 
     break; 
    } 
} 

Assert.AreEqual(value, dictionary[key]); // I have Fail here! 

我在想:

  1. 什麼是設定新的價值正確的方法爲IDictionary的當 我不知道相應的鍵。

  2. 爲什麼我的示例不起作用?據我瞭解,我已經爲值DictionaryEntry設置了新值 ,值但是 它在源文件中沒有受到影響IDictionary。爲什麼?

+0

有沒有使用通用字典中的原因是什麼?字典 Simon 2012-03-28 06:10:31

+0

是的,我不能使用泛型 – 2012-03-28 10:18:03

回答

1

DictionaryEntry沒有直接引用實際值,而是內部數據結構完全不同。因此,在DictionaryEntry上設置值對於實際在Hashtable中的值無效。

要設置一個值,您必須使用索引器。您可以枚舉鍵而不是鍵 - 值對。此代碼是等價的,你試着用的DictionaryEntry什麼:

IDictionary dictionary = new Hashtable(); 
const string key = "key"; 
const string value = "value"; 
dictionary[key] = null; // set some trigger here 

foreach(var k in dictionary.Keys.OfType<object>().ToArray()) 
{ 
    if(dictionary[k] == null) 
     dictionary[k] = value; 
} 
+0

使用'Cast '而不是'OfType '更有意義。另外值得一提的是'DictionaryEntry'是一個結構體。 (這是一個邪惡的可變結構,啓動!)當你枚舉Hashtable時,你得到一系列這些結構,告訴你Hashtable中有什麼,但不能用來修改Hashtable。如果該結構已經變得不可變,那麼這將更加明顯,就像其後繼者KeyValuePair 一樣。 – phoog 2012-03-27 20:58:18

0

建議

  • 移動到Dictionary<string,string>
  • 不要遍歷項目。只需將它直接

所以想這樣

var dictionary = new Dictionary<string,string>(); 
var key = "key"; 
var value = "value"; 
dictionary[key] = null; // set some trigger here 

// set value 
dictionary[key] = value; 

Assert.AreEqual(value, dictionary[key]);