31

辞書を列挙するにはどうすればよいですか?

foreach()辞書の列挙に使用するとします。内のキーと値のペアを更新できませんforeach()。なので、他の方法が欲しいです。

4

4 に答える 4

88

辞書を列挙するには、その中の値を列挙します。

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);
}
于 2009-03-24T10:51:20.223 に答える
9

「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);
}
于 2009-03-24T11:28:27.840 に答える
8

フォーチ。3 つの方法があります。Keysプロパティ、プロパティ、Valuesまたは の列挙子であるディクショナリ自体を列挙できますKeyValuePair<TKey, TValue>

于 2009-03-24T10:51:28.257 に答える
2

リストについても同じ(更新された)質問に答えたので、辞書についても同じことが言えます。

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());

小文字にしたときにキーが一意でない場合、これはスローされます。

于 2009-03-24T11:42:07.197 に答える