5

辞書をナビゲートするためのより良い方法は何ですか?IDictionaryを持っていたとき、私は以下のコードを使用していました。

私がIDictionaryという名前を持っていると仮定しますfreq

IEnumerator enums = freq.GetEnumerator();
while (enums.MoveNext())
{
    string word = (string)enums.Key;
    int val = (int)enums.Value;
    .......... and so on

}

でも今は辞書を使って同じことをしたい

4

3 に答える 3

15

からのデフォルトの列挙子はあなたに:foreachを与えますKeyValuePair<TKey, TValue>

foreach (var item in dictionary)
// foreach (KeyValuePair<string, int> item in dictionary)
{
    var key = item.Key;
    var value = item.Value;
}

これは、古いコードのように列挙子と直接連携するコードにコンパイルされるだけです。

.Keysまたは、またはを直接列挙することもできます.Values(ただし、その場合はキーまたは値のみを取得します)。

foreach (var key in dictionary.Keys)

foreach (var val in dictionary.Values)

または、もちろんlinqは辞書に対して機能します。

辞書のC#linq <>

于 2012-05-08T12:54:29.330 に答える
8

で同じことを行うこともできますが、どちらの場合でもDictionary使用する方がクリーンです。foreach

foreach (var entry in dictionary)
{
    string key = entry.Key;
    int value = entry.Value;
    // Use them...
}

これは次と同等です。

using (var iterator = dictionary.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        var entry = iterator.Current;
        string key = entry.Key;
        int value = entry.Value;
        // Use them...
    }
}

自分自身を明示的に呼び出して反復することはめったに役に立ちません。GetEnumerator最初の値を別の方法で処理する場合など、いくつかの場合に適していますが、すべてのエントリを同じように処理する場合は、を使用しますforeach

(実際にはvarここで使用するのと同じですが、宣言するのと同じではないIEnumerator<KeyValuePair<string, int>>ことに注意してください。実際にはネストされた構造体を使用します。これは通常、心配する必要Dictionary.Enumeratorのない詳細です。)

于 2012-05-08T12:54:34.460 に答える
4

ステートメントはforeach、列挙子を介して自動的に繰り返されます。

foreach (KeyValuePair<string,int> entry in freq) {
    string word = entry.Key;
    int val = entry.Value;
    .......... and so on

}
于 2012-05-08T13:01:21.413 に答える