2011-01-28 63 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

相关问题