7

質問の回答で、次のコーディングのヒントを見つけました:-

2) パラメータが 1 つの単純なラムダ式:

x => x.ToString() //simplify so many calls

3.0 をまだ使用していない私は、このヒントをよく理解していませんが、面白そうに見えるので、いくつかの例を挙げて、これがどのように呼び出しを簡素化するかを拡張していただければ幸いです。

ラムダについて調べたので、ラムダが何をするかはわかっていると思いますが、完全には理解していない可能性があるため、少し開梱することも必要かもしれません。

4

4 に答える 4

21

単一のパラメーターを持つデリゲートのインスタンスを作成する必要がある場合、ラムダ式を使用すると、非常に簡潔な方法でそのデリゲートを「インライン」で作成できます。たとえば、リスト内の特定の人物を名前で検索するコードは次のとおりです。

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(p => p.Name == "Jon");

C# 2.0 では、もう少し長ったらしい匿名メソッドを使用できますが、それほど悪くはありません。

List<Person> list = new List<Person>();
// [..] Populate list here
Person jon = list.Find(delegate(Person p) { return p.Name == "Jon"; });

C# 1.0 では、追加のメソッド全体を作成する必要がありました。さらに、パラメーター化する場合は、別の型を作成する必要がありますが、匿名メソッドとラムダ式は実行環境 (ローカル変数など) をキャプチャするため、クロージャーのように動作します。

public Person FindByName(List<Person> list, String name)
{
    return list.Find(p => p.Name == name); // The "name" variable is captured
}

これについては、クロージャに関する私の記事で詳しく説明しています。

デリゲートをメソッドに渡すことは、C# 2.0 と .NET 2.0 ではそれほど一般的ではありませんが、LINQ の基礎の大部分を占めているため、C# 3.0 と .NET 3.5 で頻繁に使用する傾向があります。

于 2008-10-01T09:16:35.310 に答える
2

これは基本的に次のように展開されます。

private string Lambda(object x) {
  return x.ToString();
}
于 2008-10-01T09:12:47.410 に答える
1

C# 2.0 の匿名メソッドに精通していますか? これら 2 つの呼び出しは同等です (SomeMethod がデリゲートなどを受け入れると仮定します)。

SomeMethod(x => x.ToString());

SomeMethod(delegate (SomeType x) { return x.ToString();});

どちらを入力したいかはわかっています...

于 2008-10-01T09:18:12.700 に答える
0
string delegate(TypeOfX x)
{
  return x.ToString();
}
于 2008-10-01T09:16:40.257 に答える