请参阅我的代码:
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!
我想知道:
什么是为 IDictionary 设置新值的正确方法 我不知道相应的密钥。
为什么我的例子不起作用?据我所知,我已经树立了新的价值 DictionaryEntry 按值(这里的值是参考值)但是 它在源 IDictionary 中没有受到影响。为什么呢?
答案 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]);