1
var seq = Enumerable.Range(1, 10).Reverse();
var sort1 = seq.OrderBy(i => i);
var sort2 = seq.OrderBy(delegate(int i) { return i; });

sort2 はより明示的だと思いますが、sort 1 はより短いです。それ以外に、私は違いを本当に知りません。これを行うための推奨される方法は何ですか?

4

7 に答える 7

12

ラムダ式は、パラメーターを気にしない場合を除いて、すべての場合で匿名メソッドよりも (IMO) 優れています。その場合、便利なショートカットがあります。

// Lambda expression has to specify parameter types
EventHandler x = (sender, args) => Console.WriteLine("Hi");

// Anonymous method can ignore them
EventHandler x = delegate { Console.WriteLine("Hi"); };

ラムダ式には他に 2 つの「問題」IMO があります。

  • C# 3 を使用していない場合、それらは明らかに利用できません。
  • パラメーターのないラムダ式の構文はやや不格好です。

    () => stuff
    
于 2009-06-24T18:59:23.557 に答える
2

私は可能な限りラムダ構文 (sort1) を好みます。より冗長な構文が必要な場合にのみ使用します。私が書いていることを理解するのを邪魔する余分なものは、非生産的なコードだと考えています。

編集:もちろん、ラムダ構文を使用できない.NET 2.0アプリに取り組んでいる場合を除きます。それから、少なくとも匿名メソッドがあることをうれしく思います。

于 2009-06-24T18:57:20.270 に答える
2

重要な側面は、将来のメンテナーのためにコードの意図が十分に文書化されていることを確認することであるため、これはシナリオに依存することがわかりました。したがって、ラムダが最適に機能する場合もありますが、匿名メソッドの方が適している場合もあります。引数以上のものが必要なラムダの問題は、構文が雑然としているように見えることです。そのため、匿名メソッド デリゲート構文を使用して、より認識しやすい構造を提供すると便利な場合があります。

あなたが与えた例では、ラムダは明確で簡潔であるため、より良いオプションです。ただし、たとえばインライン イベント ハンドラーを宣言する場合は、匿名メソッドの方が (保守性に関して) より優れたソリューションを提供する可能性があります。

于 2009-06-24T19:02:06.547 に答える
1

ラムダ式よりもデリゲート構文が好きなところはほとんどありません (そして、一番上に 1 つしか思いつきません)。

public event Action Evt = delegate {};
public event Action Evt = () => { };

... 例えば。残りの時間は、デリゲートが邪魔になります。ジョンのコメントによると...

public event EventHandler Evt = delegate {};
public event EventHandler Evt = (s,ea) => { };
于 2009-06-24T19:03:21.147 に答える
0

私が知る限り、どちらの方法でも (少なくともこの例では) まったく同じ IL コードが生成されるため、実際には好みの問題です。ラムダの方が美味しいと思うことがよくあります。

于 2009-06-24T19:01:37.157 に答える
0

sort1 - ラムダは、匿名メソッドを記述するための好ましい方法だと思います

于 2009-06-24T19:03:19.837 に答える