Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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));