2008-09-12 16 views
40

私はC#を使用しています。Predicate Delegateをインラインでどのように宣言しますか?

私はいくつかのフィールドを持つオブジェクトを持っているので、実際に何か問題はありません。 私はこれらのオブジェクトの総称リストを持っています。

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

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

私はRemoveAllに渡すことができるデリゲートを定義できますが、匿名デリゲートでこのインラインを定義する方法を知りたいと思います。一度の場所でのみ使用されるデリゲート関数を作成するのではなく、

明示的なデリゲート

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

ラムダ

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

追加::

答えて

52

二つのオプションは、明示的なデリゲートまたはラムダ構文を装ったデリゲートありますパフォーマンスはどちらも同等です。事実、両方の言語構成は、コンパイル時に同じILを生成します。 C#3.0は、基本的にC#2.0の拡張であるため、これはあるので、それは、C#2.0の構造:)

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がサポートしていません。匿名の代理人。

+0

それはラムダを持っているのに、なぜVB匿名デリゲートをしたいでしょうか? はい、次のバージョンは値(= 'Sub's)を返さない複数行のlambdaとlambdaを持ちます。 –

+2

あなたが今述べた理由のために、複数行のステートメントと値を返さない関数があります。それは次のバージョンになるはずですが、C#は2005年以来それを持っていました。 –

10
//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); 
0

述語はPARAMを取り、ブール値を返すデリゲートです。

我々は

RemoveAll(p=> p.x > 2); 

2)は、匿名関数を使用したインラインラムダ式を使用して、次の方法

1)で同じことを行うことができ述語を使用して

RemoveAll(delegate(myObject obj){ 

    return obj.x >=10; 
}) 

3)デリゲート

Predicate<myObject> matches = new Predicate<myObject>(IsEmployeeIsValid); 
RemoveAll(matches); 

Predicate<Foo> matches = delegate(Foo o){ return o.X >= 20; }); 
RemoveAll(matches); 

3)//

public delegate bool IsInValidEmployee (Employee emp); 

IsInValidEmployee invalidEmployeeDelegate = new IsInValidEmployee(IsEmployeeInValid); 
myObjects.RemoveAll(myObject=>invalidEmployeeDelegate(myObject); 

explicitilyデリゲートを宣言し、機能を指して実際の機能

public static bool IsEmployeeInValid(Employee emp) 
{ 
    if (emp.Id > 0) 
     return true; 
    else 
     return false; 
} 
関連する問題