2009-04-08 12 views
5

Ich habe eine Liste von Objekten, die ich durch einen ganzzahligen ParameterHinzufügen eines Parameters zu einem FindAll für eine generische Liste in C#

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; 
} 

filtern wollen, was ich bin auf der Suche zu tun ist, um GroupLevel0 in dauern eine Integer als Parameter anstelle von Hardcoding auf 0. Ich arbeite in .NET 2.0, so dass Lambda-Ausdrücke ein No-Go sind. Ist es überhaupt möglich, einen Parameter in ein Prädikat zu überführen?

Danke,

Antwort

7

Wenn Sie mit C# 2.0 stecken, eine anonyme Methode verwenden - nur ein leicht clunkier Lambda-Ausdruck (Ausdruck Bäume ignorieren):

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

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

Oder Sie könnten noch verwenden Methodenaufruf starten mit:

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; 
    }; 
} 

Wenn Sie Visual Studio 2008, aber Targeting .NET 2.0, jedoch verwenden, ca Sie n verwende immer noch einen Lambda-Ausdruck. Es ist nur ein Compiler-Trick, der keine Framework-Unterstützung benötigt (wiederum Ignorieren von Ausdrucksbäumen).

+0

Skeet! Wieder geschnippelt! – FlySwat

+0

Danke Jon & FlySwat! –

+0

@Jon Ist es nicht zu sein? ObjectList = objectList.FindAll (Delegate (testObject Element) ?? –

2
int groupLevel = 0; 

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

Dies ist ein anonymer Delegierter, es schließt sich über den lexikalischen Umfang ihrer Eltern, so kann es sehen „Grouplevel“.

Funktioniert in C# 2.0 und höher. Ich würde empfehlen, ein Lambda zu verwenden, wenn Sie zu .NET 3.5 in der Zukunft wechseln.

+0

Oder auch wenn Sie zu C# 3, aber immer noch .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; } 

Wenn Sie VS 2008 verwenden, können Sie weiterhin lambdas beim Kompilieren zu 2.0 verwenden. Es verwendet den 3.5-Compiler mit einem 2.0-Ziel und wir verwenden es seit Monaten.

+0

Warum? Das ist ein bisschen dumm. – FlySwat

+0

Was ist ein bisschen doof? –

+0

Ihr Wrapping einen Delegaten ohne Grund, nur den Delegierten-Code in den anonymen Delegierten – FlySwat