2009-04-08 9 views
5

私は整数パラメータでフィルタリングしたいオブジェクトのリストを持っています。C#で汎用リストのFindAllにパラメータを追加する

List<testObject> objectList = new List<testObject>(); 

// populate objectList with testObjects 

objectList.FindAll(GroupLevel0); 

private static bool GroupLevel0(testObject item) 
{ return item._groupLevel == 0; } 

private class testObject 
{ 
    public string _FieldSQL = null; 
    public int _groupLevel; 
} 

私が探しているのはGroupLevel0を0にハードコードする代わりに、パラメータとして整数にすることです。 .NET 2.0で動作するので、ラムダ式は使えません。述語にパラメータを渡すことさえ可能ですか?

ありがとう、

答えて

7

をありがとう - (式ツリーを無視して)わずかclunkierラムダ式:

List<testObject> objectList = new List<testObject>(); 
int desiredGroupLevel = 10; 

objectList.FindAll(delegate (testObject item) 
{ 
    return item._groupLevel == desiredGroupLevel; 
}); 

それとも、まだ使用することができますがあなたはしかし、あなたがCAは、Visual Studio 2008のが、 .NET 2.0をターゲットを使用している場合

List<testObject> objectList = new List<testObject>(); 
int desiredGroupLevel = 10; 

objectList.FindAll(CheckGroupLevel(desiredGroupLevel)); 

... 

public Predicate<testItem> CheckGroupLevel(int level) 
{ 
    return delegate (testItem item) 
    { 
     return item._groupLevel == level; 
    }; 
} 

:で開始するためのメソッド呼び出しnはまだラムダ式を使います。これは、フレームワークのサポートを必要としないコンパイラのトリックです(ここでも、式ツリーを無視します)。

+0

SKEET!もう一度狙撃! – FlySwat

+0

ありがとうJon&FlySwat! –

+0

@Jon Isntそれは 'objectList = objectList.FindAll(デリゲート(testObject item)')であるはずですか? –

2
int groupLevel = 0; 

    objectList.FindAll(
     delegate(testObject item) 
     { 
      return item._groupLevel == groupLevel; 
     }); 

これは匿名の代理人です。親のレキシカルスコープを閉じるので、「groupLevel」が表示されます。

C#2.0以上で動作します。将来は.NET 3.5に移行する場合はラムダを使用することをお勧めします。

+0

またはC#3に移行しても.NET 2.0 ... –

0
List<testObject> objectList = new List<testObject>(); 

// populate objectList with testObjects 

objectList.FindAll(delegate(testObject o){ return GroupLevel(o, 0);}); 

private static bool GroupLevel(testObject item, int groupLevel) 
{ return item._groupLevel == groupLevel; } 

また、VS 2008を使用している場合は、2.0にコンパイルするときでもラムダを使用できます。 2.0ターゲットで3.5コンパイラを使用しており、これを数か月にわたって使用してきました。

+0

なぜですか?それはちょっと愚かです – FlySwat

+0

愚かなのですか? –

+0

デリゲートをラップする理由はありません。デリゲートコードを匿名デリゲートに入れてください。 – FlySwat

関連する問題