Вы не можете изменить значение словарной записи при циклическом просмотре элементов в словаре, хотя вы можете изменить свойство значения, если это экземпляр ссылочного типа.
Например,
public class MyClass
{
public int SomeNumber { get; set;}
}
foreach(KeyValuePair<string, MyClass> entry in myDict)
{
entry.Value.SomeNumber = 3; // is okay
myDict[entry.Key] = new MyClass(); // is not okay
}
Попытка изменить словарь (или любую коллекцию) при циклическом просмотре его элементов приведет к InvalidOperationException
о том, что коллекция была изменена.
Чтобы ответить на ваши конкретные вопросы,
Мой вопрос заключается в том, как я могу изменить значение или ключ при циклическом просмотре словаря?
Подход к обоим будет в значительной степени одинаковым. Вы можете либо перебрать копию словаря, как сказал Энтони Пенграм в его ответ , либо вы можете перебрать все элементы один раз, чтобы выяснить, какие из них нужно изменить, а затем снова перебрать список эти предметы:
List<string> keysToChange = new List<string>();
foreach(KeyValuePair<string, string> entry in myDict)
{
if(...) // some check to see if it's an item you want to act on
{
keysToChange.Add(entry.Key);
}
}
foreach(string key in keysToChange)
{
myDict[key] = "new value";
// or "rename" a key
myDict["new key"] = myDict[key];
myDict.Remove(key);
}
И позволяет ли словарь дублировать ключ? И если да, как мы можем избежать?
Словарь не допускает дублирование ключей. Если вам нужна коллекция из <string, string>
пар, посмотрите NameValueCollection .