2014-03-05 38 views
0

为什么在下面的linq语句中有两个不同的变量(rx)?为什么在这个linq语句中有两个不同的变量?

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” 和 “选择” 条款使用相同的变量([R)?

回答

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是如何区别的范围。就像每个函数的参数有不同的范围。

但是在最后一个函数中。你会看到有一个内部作用域函数,用于选择。这需要是一个不同的命名参数,以避免与外部冲突x。因此它需要是r

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

+0

谢谢阿隆。我知道了。 :) – burhan

+0

Aron,所以我们不能用'x => x'替换最后一个'r => r'。导致xs会重叠。对? – burhan

+1

是的。从技术上讲,它的范围内已经存在一个名为'x'的变量/参数。所以你会定义另一个同名的变量/参数。在*有些情况下,它是合法的,但它从来不是一个好主意。 – Aron

0

řX不变量

这些是元素的别名中字典

这种方案被用来lambda表达式指向任何/所有元件在仿制药。

了解更多Lambda Expression

相关问题