2009-04-08 8 views
5

Ho una lista di oggetti che voglio filtrare per un parametro interoAggiunta di un parametro per un FindAll per un elenco generico 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; 
} 

Quello che sto cercando di fare è quello di rendere GroupLevel0 prendere in un intero come parametro invece di hardcoding su 0. Sto lavorando in .NET 2.0, quindi le espressioni lambda sono un no-go. È persino possibile passare un parametro in un predicato?

Grazie,

risposta

7

Se sei bloccato con C# 2.0, utilizzare un metodo anonimo - solo un'espressione lambda leggermente ingombranti (ignorando alberi di espressione):

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

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

o si potrebbe ancora utilizzare un chiamata di metodo per cominciare:

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

Se si utilizza Visual Studio 2008, ma mira NET 2.0, tuttavia, si ca n uso ancora un'espressione lambda. È solo un trucco per compilatore che non richiede supporto per il framework (di nuovo, ignorando gli alberi di espressione).

+0

SKEET! Sniped di nuovo! – FlySwat

+0

Grazie Jon e FlySwat! –

+0

@Jon Isnt dovrebbe essere 'objectList = objectList.FindAll (delegate (item testObject)' ?? –

2
int groupLevel = 0; 

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

Questo è un delegato anonimo, chiude sopra l'ambito lessicale del suo genitore, in modo che possa vedere "GroupLevel".

Funziona in C# 2.0 e versioni successive. Ti consiglio di utilizzare una lambda se passi a .NET 3.5 in futuro.

+0

O anche se si passa a C# 3 ma ancora .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; } 

Inoltre, se si utilizza VS 2008, è ancora possibile utilizzare lambdas durante la compilazione a 2.0. Usa il compilatore 3.5 con un target 2.0, e lo usiamo da mesi.

+0

Perché? È un po 'sciocco. – FlySwat

+0

What's kinda –

+0

Il tuo incarto di un delegato senza motivo, basta inserire il codice delegato nel delegato anonimo – FlySwat