Как выполнить итерации через значения изменения и Словарь?

Dictionary<string,double> myDict = new Dictionary();
//...
foreach (KeyValuePair<string,double> kvp in myDict)
 {
     kvp.Value = Math.Round(kvp.Value, 3);
}

Я получаю ошибку: "Свойство или индексатор 'Система. Наборы. Универсальный. KeyValuePair. Значение' не может быть присвоено - это только для чтения".
Как я могу выполнить итерации через myDict и значения изменения?

68
задан Mediator 11 August 2011 в 09:27
поделиться

3 ответа

Согласно MSDN:

Оператор foreach является оберткой вокруг перечислителя, который позволяет только читать из коллекции, но не записывать в нее.

Use this:

var dictionary = new Dictionary<string, double>();
// TODO Populate your dictionary here
var keys = new List<string>(dictionary.Keys);
foreach (string key in keys)
{
   dictionary[key] = Math.Round(dictionary[key], 3);
}
100
ответ дан 24 November 2019 в 14:12
поделиться

Вы не должны изменять словарь во время итерации, иначе вы получите исключение.

Итак, сначала скопируйте пары ключ-значение во временный список, а затем выполните итерацию по этому временному списку, а затем измените свой словарь:

Dictionary<string, double> myDict = new Dictionary<string, double>();

// a few values to play with
myDict["a"] = 2.200001;
myDict["b"] = 77777.3333;
myDict["c"] = 2.3459999999;

// prepare the temp list
List<KeyValuePair<string, double>> list = new List<KeyValuePair<string, double>>(myDict);

// iterate through the list and then change the dictionary object
foreach (KeyValuePair<string, double> kvp in list)
{
    myDict[kvp.Key] = Math.Round(kvp.Value, 3);
}


// print the output
foreach (var pair in myDict)
{
    Console.WriteLine(pair.Key + " = " + pair.Value);
}

// uncomment if needed
// Console.ReadLine();

вывод (на моей машине):

a = 2.2
{{1 }} b = 77777.333
c = 2.346

Примечание : с точки зрения производительности это решение немного лучше, чем опубликованные в настоящее время решения, поскольку значение уже присвоено ключу, и нет необходимости получать его снова из объекта словаря.

8
ответ дан 24 November 2019 в 14:12
поделиться

Перебирайте ключи в словаре, а не пары ключ-значение.

Dictionary<string, double> myDict = new Dictionary<string, double>();
//...
foreach (string key in myDict.Keys)
{
    myDict[key] = Math.Round(myDict[key], 3);
}
-2
ответ дан 24 November 2019 в 14:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: