为什么这个linq语句中有2个不同的变量?

时间:2014-03-05 02:28:45

标签: c# linq variables lambda

为什么下面的linq语句中有2个不同的变量( r x )?

var letters = new Dictionary<int, string>();
letters.Add(1, "a");
letters.Add(2, "b");
letters.Add(3, "c");
letters.Add(4, "d");
letters.Add(5, "b");
....

 Dictionary<string,List<int>> mydict  = 
               letters.GroupBy(r=> r.Value)
              .ToDictionary(x=> x.Key, x=> x.Select(r=> r.Key).ToList());

为什么“GroupBy”和“Select”子句使用相同的变量( r )?

2 个答案:

答案 0 :(得分:4)

lambda表达式可以被认为是一种内联函数。

您可以按以下方式重写代码(如果忽略Linq的表达式树侧)。

Dictionary<string,List<int>> mydict  = 
           letters.GroupBy(Grouping)
          .ToDictionary(KeySelector, ValueSelector);

public string Grouping(KeyValuePair<int, string> r)
{
    return r.Value;
}

public string KeySelector(IGrouping<string, KeyValuePair<int, string>> x)
{
    return x.Key;
}

public List<int> ValueSelector(IGrouping<string, KeyValuePair<int, string>> x)
{
    return x.Select(r => r.Key).ToList();
}

这可能有助于向您展示每个x如何是差异范围。就像每个函数的参数范围不同一样。

然而在最后一个功能中。你会看到有一个内部范围的函数,用于选择。这需要是一个不同的命名参数,以避免与outter x发生冲突。因此,它必须是r

最后。不要在Linq查询中不必扩展这些lambda。正如我之前提到的,有一种叫做Expression Trees的东西。这些命名函数不能用于构建表达式树,这就是Linq可用于构建SQL查询的方式。

答案 1 :(得分:0)

r x 不是变量

这些是 Dictionary

中元素的别名

这种方法使用 lambda表达式来指向泛型中的任何/所有元素。

了解更多Lambda Expression