设置DictionaryEntry的值

本文关键字:的值 DictionaryEntry 设置 | 更新日期: 2023-09-27 18:29:15

请参阅我的代码:

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. 当我不知道对应的钥匙。

  2. 为什么我的例子不起作用?据我所知,我已经树立了新的价值观对于DictionaryEntry按值(此处的值为参考),但是它在来源IDictionary中没有受到影响。为什么?

设置DictionaryEntry的值

DictionaryEntry没有直接引用实际值,内部数据结构完全不同。因此,在DictionaryEntry上设置值对哈希表中的实际值没有任何作用。

若要设置值,必须使用索引器。您可以在键上枚举,而不是在键值对上枚举。此代码相当于您使用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;
}

建议

  • 移动到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]);