此代码中两个选择器函数的返回值之间的差异

use*_*437 5 c# linq dictionary igrouping

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));
Run Code Online (Sandbox Code Playgroud)

Students对象有NameWeight键-值对.

在ToDictionary方法中,t变量是类型IEnumerable<IGrouping<K, T>>.那是,IEnumerable<IGrouping<int, Students>>

为什么Key返回的值t=>t.Keyt=> t.Select(**x=> x.Key**)不同?它们都使用相同的t变量.Key应该是类型int.

图像是在执行GroupBy方法之后拍摄的.(它不是完整图像)其中一个Key具有值,60而另一个具有值Bob,MattAdam.

在此输入图像描述

Eli*_*bel 2

因为它不是一个

IEnumerable<IGrouping<int, Student>>
Run Code Online (Sandbox Code Playgroud)

它是

IEnumerable<IGrouping<int, KeyValuePair<int, Student>>>
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)