5
var Students = new Dictionary<string, int>();
Students.Add( "Bob" , 60);
Students.Add( "Jim" , 62);
Students.Add( "Jack", 75);
Students.Add( "John", 81);
Students.Add( "Matt", 60);
Students.Add( "Jill", 72);
Students.Add( "Eric", 83);
Students.Add( "Adam", 60);
Students.Add( "Gary", 75);

var MyVar  = Students.GroupBy(r=> r.Value)
                     .ToDictionary(t=> t.Key, t=> t.Select(x=> x.Key));

StudentsオブジェクトにはNameとキーと値のWeightペアがあります。

ToDictionary メソッドでは、tvariable の型はIEnumerable<IGrouping<K, T>>です。あれは、IEnumerable<IGrouping<int, Students>>

と でKey返される値が異なるのはなぜですか? どちらも同じ変数を使用します。タイプである必要があります。t=>t.Keyt=> t.Select(**x=> x.Key**)tKeyint

画像は GroupBy メソッドを実行した後に撮影されたものです (完全な画像ではありませKeyん) 。60BobMattAdam

ここに画像の説明を入力

4

4 に答える 4

2

ではないので

IEnumerable<IGrouping<int, Student>>

それは

IEnumerable<IGrouping<int, KeyValuePair<int, Student>>>

ではt => t.Keyグループ化キーをSelect(x => x.Key)参照しており、 ではKeyValuePair.

Visual Studio の変数にカーソルを合わせると、型と型パラメーターが表示されます。

さらに詳細に:

// return an IEnumerable<IGrouping<int, KeyValuePair<int, Student>>>
Students.GroupBy(r=> r.Value)
// iterate over each IGrouping<int, KeyValuePair<int, Student>>
    .ToDictionary(
        group => group.Key,
// iterate over each KeyValuePair<int, Student> in the group
// because IGrouping<TKey, TElement> inherits from IEnumerable<TElement>
// so it's a Select over an IEnumerable<KeyValuePair<int, Student>>
        group => group.Select(pair => pair.Key));
于 2014-03-27T14:51:08.093 に答える
2

番号をキーとして、特定のキーに関連する元の辞書からすべての生徒の名前を使用して、新しい辞書を作成しています。

これがどのように機能するかです。

キー値が返される理由t=>t.Key

これは、元の辞書にある に適用されるGroupByため、に作用します。したがって、新しいディクショナリには、元のディクショナリの値に基づいた個別のキーが含まれます。GroupByValueint

と t=> t.Select( x=> x.Key ) 違いますか?

現在、これは元の辞書のSelect各項目で動作しています。生徒の名前はGroupByどこですか。したがって、以前に選択Keyしたものに基づいてすべての学生の名前を取得しますKeyGroupBy

于 2014-03-27T14:51:14.147 に答える
1

の結果はStudents.GroupBy(r => r.Value)こんな感じ。GroupBy両方とも aをDictionary使用するため、少し混乱しますKey

    { (Key = 60, {(Key = "Bob", Value = 60), (Key = "Matt", Value = 60), ...}),
      (Key = 62, {(Key = "Jim", Value = 62)}),
      (Key = 72. ...),
      ...
    }

tこのグループ化の1 つの行です。

最初のセレクターt.Keyは を生成し60ます。

2 番目のセレクターはリストt.Select(x => x.Key)を操作し、を生成します。{"Bob", "Matt", "Adam"}

于 2014-03-27T14:50:23.330 に答える
0

( )のはKey、でグループ化したキーです。この場合、これは のです。 IGroupingt.KeyGroupByValueKeyValuePair

Select( )内のキーは、グループ内の各ペアx.Keyのキーを取得しています。KeyValuePair

推論された型のため、ここではあまり明白ではありませんが、Visual Studio でxとの両方にカーソルを合わせると、 であり であり、であることがわかります。また、より意味のある変数名を使用することで、このクエリの明確さを向上させることもできます (私の考えではかなり)。ttIGroupingxKeyValuePair

var MyVar = Students.GroupBy(pair => pair.Value)
                        .ToDictionary(group => group.Key,
                        group => group.Select(pair => pair.Key));
于 2014-03-27T14:48:45.437 に答える