Установить значение для DictionaryEntry - PullRequest
1 голос
/ 28 марта 2012

Пожалуйста, смотрите мой код:

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 ]

1 голос
/ 28 марта 2012

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 голосов
/ 28 марта 2012

Предложения

  • Перейти к 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]);
...