2014-03-05 41 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

相關問題