为什么下面的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 )?
答案 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)