С# Обновить словарь <строка, строкa> с запросом LINQ

58
7

Я пытаюсь обновить свои настройки программы, которые хранятся в словаре. Как ни странно, если они были сохранены в DatabaseContext, следующая функция будет работать (я думаю), но поскольку они находятся в словаре, я получаю ошибку компилятора. Почему мой KeyValuePair.Value только для чтения? Что еще более важно, как я могу переписать следующую функцию для фактического обновления словаря?


Спасибо


public void putSetting(Dictionary<string, string> settings, string setting, string value)
{
var qry = (from s in settings
where s.Key == setting
select s).Single();
qry.Value = value; // Error 1 Property or indexer
// 'System.Collections.Generic.KeyValuePair<string,string>.Value'
// cannot be assigned to -- it is read only
}

спросил(а) 2020-04-03T23:55:21+03:00 6 месяцев, 3 недели назад
1
Решение
114

Честно говоря, я бы предпочел написать следующее:


settings[setting] = value;

вместо этого метода putSetting, который лишен естественного смысла для существования. Должен признать, что во время обзоров кода я видел много вещей, но это победитель.

ответил(а) 2020-04-04T00:09:33.829913+03:00 6 месяцев, 3 недели назад
99

Не только верно, что Value является только для чтения, но также следует учитывать, что KeyValuePair сам является struct, поэтому KeyValuePair у вас есть после вашего запроса новый экземпляр, а не ссылку на ссылку в Dictionary.


Я немного смущен, почему вы используете linq для этого?

Для Dictionary<string,string> вы можете просто использовать:


 settings[setting] = value

ответил(а) 2020-04-03T23:55:21+03:00 6 месяцев, 3 недели назад
91

Value KeyValuePair всегда только для чтения. Обратите внимание на отклонение


public TValue Value { get; }

Используйте


settings[setting] = value;

вместо этого. Видя, насколько это коротко, я не уверен, что вы действительно набираете с помощью этого метода.

ответил(а) 2020-04-03T23:55:21+03:00 6 месяцев, 3 недели назад
71

Существует несколько проблем с этим подходом.


    Тип qry - это KeyValuePair<TKey, TValue>. Это структура readonly, которая означает, что вы не можете изменять ее свойства.
    Кроме того, поскольку это struct, это копия структуры внутри Dictionary<TKey, TValue>. Даже если вы можете его мутировать, он не обновит значение внутри Dictionary<TKey, TValue> и, следовательно, не будет иметь эффекта

Здесь вы ищете индексатор на Dictionary<TKey, TValue>, который позволяет вставлять значения для заданного ключа


settings[setting] = value;

ответил(а) 2020-04-03T23:55:21+03:00 6 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема