2009-04-08 18 views
5

Tengo una lista de objetos que quiero filtrar por un parámetro enteroAdición de un parámetro a un FindAll para una lista genérica en 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; 
} 

Lo que estoy tratando de hacer es hacer GroupLevel0 tomar en un entero como parámetro en lugar de hardcoding a 0. Estoy trabajando en .NET 2.0 por lo que las expresiones lambda son un no-go. ¿Es posible pasar un parámetro a un predicado?

Gracias,

Respuesta

7

Si está atrapado con C# 2.0, utilizar un método anónimo - sólo una expresión lambda ligeramente clunkier (ignorando los árboles de expresión):

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

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

O aún se podía utilizar una llamada a un método para iniciar con:

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

Si está utilizando Visual Studio 2008, pero la orientación .NET 2.0, sin embargo, que ca n todavía usa una expresión lambda. Es solo un truco de compilación que no requiere soporte de framework (una vez más, ignorando los árboles de expresión).

+0

¡SKEET! ¡Sniped otra vez! – FlySwat

+0

¡Gracias Jon y FlySwat! –

+0

@Jon ¿No se supone que es 'objectList = objectList.FindAll (delegate (item TestObject)'? –

2
int groupLevel = 0; 

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

Este es un delegado anónimo, se cierra sobre el ámbito léxico de su padre, por lo que puede ver "groupLevel".

Funciona en C# 2.0 y superior. Recomiendo usar un lambda si te mueves a .NET 3.5 en el futuro.

+0

O incluso si te mueves a C# 3 pero aún a .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; } 

Además, si usa VS 2008, aún puede usar lambdas al compilar en 2.0. Utiliza el compilador 3.5 con un objetivo 2.0 y lo hemos estado utilizando durante meses.

+0

¿Por qué? Eso es un poco tonto – FlySwat

+0

¿Qué es un poco tonto? –

+0

Envolviendo a un delegado sin ninguna razón, simplemente ponga el código de delegado en el delegado anónimo – FlySwat

Cuestiones relacionadas