ConvertAll <guid>(Guid.Parse)如何工作?</guid>

时间:2011-01-28 08:02:20

标签: c# refactoring

首先我有这种线

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

然后ReSharper给了我一个提示,我可以将它转换为方法组。该操作的结果是这个

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

我对语法感到困惑..它是如何以及为什么有效?我的意思是没有parse方法的参数。魔术我会说。

更新

更紧凑的转换

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

2 个答案:

答案 0 :(得分:3)

ConvertAll(在此上下文中)此处需要Converter<string,Guid> - 一个方法的委托,该方法接受string并返回Guid。静态Guid.Parse完全满足 - 与我们编写new Converter<string,Guid>(Guid.Parse)或写成:

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

lambda 版本通过匿名方法添加间接级别:

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

所以直接调用Guid.Parse实际上略微更有效率。

答案 1 :(得分: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);

现在内联变量,然后转到原始代码。这会让事情更清楚吗?