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方法中,t
变量的类型为IEnumerable<IGrouping<K, T>>
。也就是IEnumerable<IGrouping<int, Students>>
为什么Key
和t=>t.Key
返回的t=> t.Select(**x=> x.Key**)
值不同?它们都使用相同的t
变量。 Key
应为int
类型。
图像是在执行GroupBy方法后拍摄的。(它不是完整图像)其中一个Key
的值为60
,另一个的值为{{ 1}},Bob
和Matt
。
答案 0 :(得分: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));
答案 1 :(得分:2)
它正在创建一个新的字典,其中数字为Key,原始字典中的所有学生姓名都与特定键相关。
以下是它的工作原理。
为什么
返回了键值t=>t.Key
这是在GroupBy
上运行,因为GroupBy
已应用于Value
,原始字典中为int
。因此,新词典将具有基于原始词典的值的不同键。
和t =&gt; t。选择( x =&gt; x.Key )不同?
现在这个Select
正在对原始字典中的每个GroupBy
项进行操作。 Key
是学生姓名的地方。因此,根据先前在Key
GroupBy
获取所有学生姓名
答案 2 :(得分:1)
这就是Students.GroupBy(r => r.Value)
的结果。这有点令人困惑,因为GroupBy
和Dictionary
都使用Key
。
{ (Key = 60, {(Key = "Bob", Value = 60), (Key = "Matt", Value = 60), ...}),
(Key = 62, {(Key = "Jim", Value = 62)}),
(Key = 72. ...),
...
}
t
是此分组的一个行。
第一个选择器t.Key
产生60
。
第二个选择器t.Select(x => x.Key)
在列表上运行并产生{"Bob", "Matt", "Adam"}
。
答案 3 :(得分:0)
Key
(IGrouping
)的t.Key
是您在GroupBy
中分组的关键字。在这种情况下,这是Value
的{{1}}。
KeyValuePair
(Select
)中的密钥正在获取组内每对x.Key
的密钥。
由于推断类型,此处不太明显,但您可以将鼠标悬停在visual studio中的KeyValuePair
和x
上,以查看t
是t
1}}和IGrouping
是x
。您还可以通过使用更有意义的变量名来提高此查询的清晰度(在我看来相当多)。
KeyValuePair