辞書を列挙するにはどうすればよいですか?
foreach()
辞書の列挙に使用するとします。内のキーと値のペアを更新できませんforeach()
。なので、他の方法が欲しいです。
辞書を列挙するにはどうすればよいですか?
foreach()
辞書の列挙に使用するとします。内のキーと値のペアを更新できません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's 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);
}
フォーチ。3 つの方法があります。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);
}
ループの外側で更新を行う必要があるため、列挙するときに辞書を変更しないことに注意してください。また、これは2つのキーを同じにすることによって引き起こされる衝突を検出します-それはスローします(の使用のためAdd
)。
例-すべてのキーを小文字にし、すべての値を:でトリミングしDictionary<string, string>
ます
myDict.MutateEach(key => key.ToLower(), value => value.Trim());
小文字にしたときにキーが一意でない場合、これはスローされます。