43

だから私はいくつかのフィールドを持つオブジェクトを持っていますが、実際には何の問題もありません。これらのオブジェクトの一般的なリストがあります。

List<MyObject> myObjects = new List<MyObject>();
myObjects.Add(myObject1);
myObjects.Add(myObject2);
myObjects.Add(myObject3);

そのため、いくつかの基準に基づいてリストからオブジェクトを削除したいと考えています。たとえば、これを行うためにメソッドmyObject.X >= 10. を使用したいと思います。RemoveAll(Predicate<T> match)

RemoveAll に渡すことができるデリゲートを定義できることはわかっていますが、一度だけ使用される一連のデリゲート関数を作成する代わりに、これを匿名デリゲートでインラインで定義する方法を知りたいです。

4

4 に答える 4

57

明示的なデリゲートまたはラムバ コンストラクトを装ったデリゲートの 2 つのオプションがあります。

明示的なデリゲート

myObjects.RemoveAll(delegate (MyObject m) { return m.X >= 10; });

ラムダ

myObjects.RemoveAll(m => m.X >= 10);

パフォーマンスに関しては、どちらも同等です。実際のところ、どちらの言語構造もコンパイル時に同じ IL を生成します。これは、C# 3.0 は基本的に C# 2.0 の拡張機能であるため、C# 2.0 の構造にコンパイルされるためです。

于 2008-09-12T14:48:08.563 に答える
15

ラムダ C# 3.0 の方法:

myObjects.RemoveAll(m => m.x >= 10);

匿名デリゲート C# 2.0 の方法:

myObjects.RemoveAll(delegate (MyObject m) {
   return m.x >= 10;
});

そして、VB の人にとっては、VB 9.0 ラムダの方法:

myObjects.RemoveAll(Function(m) m.x >= 10)

残念ながら、VB は匿名デリゲートをサポートしていません。

于 2008-09-12T14:49:10.353 に答える
11
  //C# 2.0
  RemoveAll(delegate(Foo o){ return o.X >= 10; });

また

  //C# 3.0
  RemoveAll(o => o.X >= 10);

また

  Predicate<Foo> matches = delegate(Foo o){ return o.X >= 10; });
  //or Predicate<Foo> matches = o => o.X >= 10;
  RemoveAll(matches);
于 2008-09-12T14:50:41.193 に答える