C# 此代码中两个选择器函数返回值之间的差异 var Students=newdictionary(); 学生。添加(“Bob”,60); 学生。加上(“吉姆”,62岁); 学生。加上(“杰克”,75); 学生。加上(“约翰”,81岁); 学生。添加(“Matt”,60); 学生。加上(“吉尔”,72); 学生。加上(“埃里克”,83岁); 学生。加上(“亚当”,60岁); 加上(“Gary”,75岁); var MyVar=Students.GroupBy(r=>r.Value) .ToDictionary(t=>t.Key,t=>t.Select(x=>x.Key));
C# 此代码中两个选择器函数返回值之间的差异 var Students=newdictionary(); 学生。添加(“Bob”,60); 学生。加上(“吉姆”,62岁); 学生。加上(“杰克”,75); 学生。加上(“约翰”,81岁); 学生。添加(“Matt”,60); 学生。加上(“吉尔”,72); 学生。加上(“埃里克”,83岁); 学生。加上(“亚当”,60岁); 加上(“Gary”,75岁); var MyVar=Students.GroupBy(r=>r.Value) .ToDictionary(t=>t.Key,t=>t.Select(x=>x.Key));,c#,linq,dictionary,igrouping,C#,Linq,Dictionary,Igrouping,Students对象具有Name和Weight键值对 在ToDictionary方法中,t变量的类型为IEnumerable。也就是说,IEnumerable 为什么t=>t.Key和t=>t.Select(**x=>x.Key**)返回的Key值不同?它们都使用相同的t变量键应为int类型 该图像是在执行GroupBy方法后拍摄的。(它不是完整图像)键中的一个值为60,另一个值为Bob、Matt和Adam 在GroupBy中分组的键(t.Key)是您分组的键。在这种情况下,这是KeyValue
Students
对象具有Name
和Weight
键值对
在ToDictionary方法中,t
变量的类型为IEnumerable
。也就是说,IEnumerable
为什么t=>t.Key
和t=>t.Select(**x=>x.Key**)返回的Key
值不同?它们都使用相同的t
变量<代码>键应为int
类型
该图像是在执行GroupBy方法后拍摄的。(它不是完整图像)键中的一个值为60
,另一个值为Bob
、Matt
和Adam
在GroupBy
中分组的键(t.Key
)是您分组的键。在这种情况下,这是KeyValuePair
的值
Select
(x.Key
)中的密钥为组中的每一对获取KeyValuePair
的密钥
由于推断出的类型,这里不太明显,但是您可以在visual studio中将鼠标悬停在x
和t
上,查看t
是一个i分组
,而x
是一个KeyValuePair
。您还可以通过使用更有意义的变量名来提高此查询的清晰度(在我看来,这是相当大的一部分)
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.GroupBy(r=>r.Value)
的结果。这有点混乱,因为GroupBy
和Dictionary
都使用键
var MyVar = Students.GroupBy(pair => pair.Value)
.ToDictionary(group => group.Key,
group => group.Select(pair => pair.Key));
t
是此分组的一行
第一个选择器t.Key
产生60
第二个选择器t.Select(x=>x.Key)
对列表进行操作,并产生{“Bob”、“Matt”、“Adam”}
,因为它不是一个
{ (Key = 60, {(Key = "Bob", Value = 60), (Key = "Matt", Value = 60), ...}),
(Key = 62, {(Key = "Jim", Value = 62)}),
(Key = 72. ...),
...
}
它正在创建一个以数字为键的新词典,以及与特定键相关的原始词典中的所有学生姓名
下面是它的工作原理
为什么t=>t.Key返回键值
这是在GroupBy
上操作的,因为GroupBy
应用于Value
,即原始词典中的int
。因此,新字典将具有基于原始字典值的不同键
和t=>t.Select(x=>x.Key)不同
现在,此Select
正在对原始字典中的每个GroupBy
项进行操作。其中,键
是学生姓名。因此,根据先前在GroupBy
中选择的键
获取所有学生姓名,为什么Select
操作原始词典?Select
是如何决定的?@user3467437,Select
对GroupBy
的每个项目进行操作,其中Key
作为原始字典中的值,而Value
作为原始字典中相关键的集合。问题:为什么选择(x=>x.Key)
请参阅由GroupBy
返回的KeyValuePair
?
IEnumerable<IGrouping<int, Student>>
IEnumerable<IGrouping<int, KeyValuePair<int, Student>>>
// 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));