设置DictionaryEntry的值

时间:2012-03-27 20:11:40

标签: c# hashmap hashtable

请参阅我的代码:

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 中没有受到影响。为什么呢?

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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]);