3

key=>value辞書がC#にあることを理解しているので、作成したいkey=>value(key=>value)

現在、私はできることを知っています:

Dictionary<int, int> someVar = new Dictionary<int, int>();

これにより、キー=>値が作成されます。

私ができることを作成するには(これは単なる推測です。間違っている場合は修正してください):

Dictionary<int Dictionray<int, int>> someVar = new Dictionary<int, Dictionray<int, int>>

ここで楽しい部分が来ます。この辞書オブジェクトに対して 1 つだけ for ループ実行たいのですが、すべての値を取得するので、次のようになります。

foreach (KeyValuePair<int, int> pair in someVar){
    //object = base dictionary key
    //object2 = nested dictionary key
    //object3 = nested dictionary value 
}

今、私は PHP から来たので、これは 1 つの for ループで簡単に実行できます。あなたのアイデアは何ですか?私はC#と辞書という用語に慣れていないためです(php配列は辞書ですが)。

私は、C# で次のような for ループを使用できることを知っていますpair.Keypair.Value.

2 番目の部分は、このような辞書に値を追加するにはどうすればよいですか? です。典型的な .add(bla, bla) は知っていますが、ネストされた部分にどのように値を追加しますか?

4

3 に答える 3

4

繰り返し

C# では、 をIDictionary<TKey, TValue>実装しIEnumerable<KeyValuePair<TKey, TValue>>ます。そのため、Linq クエリIDictionary<TKey, TValue>を使用して型のインスタンスを反復処理し、データ構造内のすべてを取得できます。この場合、 your自体が であるため、内部構造でもこれを行うことができます。foreachKeyValuePairTValueIDictionary

foreach(var kvp in myDictionary)
{
    foreach(var innerKvp in kvp.Value)
    {
         var myValue = innerKvp.Value
         //Logic on myValue
    }
}

Linq ライブラリを使用SelectManyすると、すべてのKeyValuePairインスタンスを非常にエレガントに取得できます。

myDictionary.SelectMany(kvp => kvp.Value);

SelectMany基本的に、リストのリストを平坦化します。この Linq クエリは次のように言っています: 辞書内の各キーと値のペアについて、すべての内部辞書を取得し、それらをキーと値のペアのリストとして扱い、それらすべてのリストを平坦化します。これは を返しますIEnumerable<KeyValuePair<TKey, TValue>>

代わりに、キーではなく内部ディクショナリの値のみを気にする場合は、ディクショナリ内のすべての値のを返すValueson プロパティを使用できます。次に、辞書の辞書内のすべての値を含むリストを取得するために使用できます。IDictionary<TKey, TValue>IEnumerable<TValue>SelectMany

myDictionary.Values.SelectMany(dict => dict.Values);

詳細についてはIDictionary<TKey, TValue> こちらをご覧ください。詳細についてはKeyValuePair<TKey, TValue> こちらをご覧ください。

追加する

このデータ構造に要素を追加するには、最初に内部辞書が null かどうかを確認する必要があります。をキーとする辞書に3をキーとする辞書に追加しようとしているとしましょう:21

var myInnerDictionary = myDictionary.ContainsKey(1) ? myDictionary[1] : (myDictionary[1] = new Dictionary<int, int>());
myInnerDictionary[1][2] = 3;

もちろん、これはその場所の値が既に存在する場合は上書きするため、それも確認するか、Add上書きしないメソッドを使用することをお勧めします。

ToDictionaryまた、他の から辞書を作成するのに役立つ Linq メソッドについても学ぶ必要がありますIEnumerables。ここでそれについて読んでください

于 2013-05-27T13:11:53.040 に答える
0

次のように、ネストされた値がループを使用せずに取得できる値を持っていforeachない限り、1 つのループのみを使用してネストされた値を含むすべての値を取得することは不可能です。Dictionaries

foreach (var pair in someVar){
    var object1 = (Dictionary<int,int>)pair.Value;
    var object2 = object1[0].Value;
    var object3 = object1[1].Value; 
    .....

    // To add a values to the nested Dictionary just use Dictionary.Add method:
    object1.Add(1,1);
}
于 2013-05-27T13:12:15.943 に答える