2011-01-28 76 views
3

首先,我有過這樣行ConvertAll <Guid>(Guid.Parse)如何工作?

List<Guid> ratingComparisonIds = ratingComparison.ConvertAll<Guid>(o => Guid.Parse(o)); 

的那麼ReSharper的給我,我可以將其轉換爲法團的提示。該操作的結果是這樣的

List<Guid> ratingComparisonIds = ratingComparison.ConvertAll<Guid>(Guid.Parse); 

我很困惑的語法..它是如何工作的?我的意思是沒有參數的解析方法。魔術我會說。

更新

更加緊湊轉換

List<Guid> ratingComparisonIds = ratingComparison.ConvertAll(Guid.Parse); 
+0

「更新」使用泛型類型推斷 - 但請注意,這可能會在C#2.0編譯器中以不同的方式編譯(即失敗),因爲C#2.0中的泛型類型推斷遠不如C#3.0中那麼強。儘管如此,我在「更新」版本中「全部爲」版本,除非由於某些原因需要在較早的編譯器上進行編譯。 – 2011-01-28 08:10:39

回答

3

它使用了方法組轉換。它正在做這樣的事情:

// Very long-winded C# 1 syntax 
Converter<String, Guid> converter = new Converter<String, Guid>(Guid.Parse); 
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll(converter); 

// Simpler C# 2 syntax 
Converter<String, Guid> converter = Guid.Parse; 
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll(converter); 

現在內聯變量,並且您得到原始代碼。這是否使事情更清楚?

+0

現在它更有意義。方法組轉換似乎是聰明的事情。我希望我能以類似的方式設計我的API。有時候我有一種感覺,C#正在發展得如此之快,以至於我甚至都不瞭解舊功能。 :) – Tx3 2011-01-28 08:22:37

3

ConvertAll(在這方面)需要在這裏需要Converter<string,Guid> - 委託給帶有string並返回一個Guid的方法。靜態Guid.Parse滿足:完美 - 就好像我們已經寫new Converter<string,Guid>(Guid.Parse),或寫的一樣:

static Guid <>____blah(string o) { return Guid.Parse(o); } 

Converter<string,Guid> conv = Guid.Parse; // perfectly valid 
List<Guid> ratingComparisonIds = ratingComparison.ConvertAll<Guid>(conv); 

拉姆達版本通過匿名方法添加了一個間接級

所以直接撥打Guid.Parse實際上是勉強效率更高。

+0

很好的解釋,謝謝。我不能標出兩個答案是一種恥辱。 +1投 – Tx3 2011-01-28 08:27:44