Как перечислить словарь?
Предположим, что я использую foreach()
для перечисления dictionay. Я не могу обновить пару ключ/значение внутри foreach()
. Поэтому мне нужен другой метод.
Как перечислить словарь?
Предположим, что я использую foreach()
для перечисления dictionay. Я не могу обновить пару ключ/значение внутри foreach()
. Поэтому мне нужен другой метод.
Чтобы перечислить словарь, вы либо перечисляете значения внутри него:
Dictionary<int, string> dic;
foreach(string s in dic.Values)
{
Console.WriteLine(s);
}
или KeyValuePairs
foreach(KeyValuePair<int, string> kvp in dic)
{
Console.WriteLine("Key : " + kvp.Key.ToString() + ", Value : " + kvp.Value);
}
или клавиши
foreach(int key in dic.Keys)
{
Console.WriteLine(key.ToString());
}
Если вы хотите обновить элементы в словаре, вам нужно сделать это несколько иначе, потому что вы не можете обновлять экземпляр при перечислении. Что вам нужно сделать, это перечислить другую коллекцию, которая не обновляется, например:
Dictionary<int, string> newValues = new Dictionary<int, string>() { 1, "Test" };
foreach(KeyValuePair<int, string> kvp in newValues)
{
dic[kvp.Key] = kvp.Value; // will automatically add the item if it not there
}
Чтобы удалить элементы, сделайте это аналогичным образом, перечисляя коллекцию элементов, которые мы хотим удалить, а не сам словарь.
List<int> keys = new List<int>() { 1, 3 };
foreach(int key in keys)
{
dic.Remove(key);
}
В ответ на проблему "я не могу обновить значение/ключ внутри foreach()", вы не можете изменять коллекцию при ее перечислении. Я бы подошел к этому, сделав копию коллекции Keys:
Dictionary<int,int> dic=new Dictionary<int, int>();
//...fill the dictionary
int[] keys = dic.Keys.ToArray();
foreach (int i in keys)
{
dic.Remove(i);
}
Foreach. Существует три способа: вы можете перечислить свойство Keys
по свойству Values
или по самому словарю, который является перечислителем KeyValuePair<TKey, TValue>
.
Я просто ответил на тот же (обновленный) вопрос для списков, так что вот то же самое для словарей.
public static void MutateEach(this IDictionary<TKey, TValue> dict, Func<TKey, TValue, KeyValuePair<TKey, TValue>> mutator)
{
var removals = new List<TKey>();
var additions = new List<KeyValuePair<TKey, TValue>>();
foreach (var pair in dict)
{
var newPair = mutator(pair.Key, pair.Value);
if ((newPair.Key != pair.Key) || (newPair.Value != pair.Value))
{
removals.Add(pair.Key);
additions.Add(newPair);
}
}
foreach (var removal in removals)
dict.Remove(removal);
foreach (var addition in additions)
dict.Add(addition.Key, addition.Value);
}
Обратите внимание, что мы должны делать обновления за пределами цикла, поэтому мы не изменяем словарь, как мы его перечисляем. Кроме того, это обнаруживает столкновения, вызванные тем, что два ключа одинаковы - они будут бросать (из-за использования Add
).
Пример - сделайте все клавиши в нижнем регистре и обрезайте все значения с помощью Dictionary<string, string>
:
myDict.MutateEach(key => key.ToLower(), value => value.Trim());
Если ключи не уникальны, когда они сделаны в нижнем регистре, это будет бросать.