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

时间:2014-03-27 14:44:39

标签: 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));

Students对象有NameWeight个键值对。

在ToDictionary方法中,t变量的类型为IEnumerable<IGrouping<K, T>>。也就是IEnumerable<IGrouping<int, Students>>

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

图像是在执行GroupBy方法后拍摄的。(它不是完整图像)其中一个Key的值为60,另一个的值为{{ 1}},BobMatt

enter image description here

4 个答案:

答案 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)的结果。这有点令人困惑,因为GroupByDictionary都使用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)

KeyIGrouping)的t.Key是您在GroupBy中分组的关键字。在这种情况下,这是Value的{​​{1}}。

KeyValuePairSelect)中的密钥正在获取组内每对x.Key的密钥。

由于推断类型,此处不太明显,但您可以将鼠标悬停在visual studio中的KeyValuePairx上,以查看tt 1}}和IGroupingx。您还可以通过使用更有意义的变量名来提高此查询的清晰度(在我看来相当多)。

KeyValuePair