2011-01-28 13 views
3

まず、私はその後、ReSharperのは、私がメソッドグループに変換することができ、ヒントを与えたラインConvertAll <Guid>(Guid.Parse)はどのように動作しますか?

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

のこの種を持っていました。この操作の結果は次のとおりです

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

私は構文について混乱しています。どのように動作するのですか?つまり、解析メソッドのパラメータはありません。私は魔法を言います。 (この文脈で)

更新

さらにコンパクト変換

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

"Update"はジェネリック型推論を使用していますが、C#2.0のジェネリック型推論はC#3.0ほど強力ではないため、これはC#2.0コンパイラでは違う方法でコンパイルできます。しかし、私は何かの理由で古いコンパイラでコンパイルする必要がある場合を除き、 "Update"のバージョンの "すべてのため"です。 –

答えて

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

3

ConvertAllConverter<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

良い説明、ありがとうございます。私が2つの答えをマークすることはできないのは残念です。 +1 vote – Tx3

関連する問題