2011-04-07 14 views
6

Tengo el siguiente ejemplo de código en C# que demuestra cómo me gustaría analizar algunas de las consultas LINQ en el argumento de una función.Pasar parte de una consulta LINQ a un argumento de una función?

public List<object> AllElements; 

public object GetAll<T>(SomeLINQQuery) { 

    //get some elements from AllElements where the argument is added to the query, as shown below. 

} 

Y ahora, para dar esto algún sentido, lo que yo estaba pensando en llevar a cabo sería la siguiente:

public void test() { 
    GetAll<object>(where object.ToString() == "lala"); 
} 

Es un poco difícil de explicar. Espero que este ejemplo lo haga bien.

+1

me gusta que proporcione un caso de uso. Si hay un caso de uso, generalmente hay un código que se puede escribir que hace que todo funcione :) – GregC

+0

En su caso de uso, no está claro para qué sirve el objeto devuelto. – GregC

Respuesta

11

Sure. Que lo haría así:

public List<T> GetAll<T>(List<T> list, Func<T, bool> where) 
{ 
    return list.Where(where).ToList(); 
} 

Usted lo llamaría así:

var result = GetAll(AllElements, o => o.ToString() == "lala"); 

Incluso se podría crear como un método de extensión:

public static List<T> GetAll<T>(this List<T> list, Func<T, bool> where) 
{ 
    return list.Where(where).ToList(); 
} 

y llamarlo como esto :

var result = AllElements.GetAll(o => o.ToString() == "lala"); 

Pero realmente, en su ejemplo sencillo, no tiene ningún sentido, porque es exactamente lo mismo que usar directamente Where:

var result = AllElements.Where(o => o.ToString() == "lala").ToList(); 

Sin embargo, si su método GetAll hace algunas cosas más, podría tener sentido para pasar el predicado a ese método.

+0

Se ve bien, pero diferiría la ejecución real de la consulta en el último momento posible usando IEnumerable en su lugar. Es una mala práctica tomar contenedores de concreto como argumentos. – GregC

+0

Estaba reutilizando su tipo. Estoy de acuerdo, que debería usar 'IEnumerable ' en su lugar. –

+0

¡¡¡Increíble !!! Muchas gracias –

1

Usted podría pasar algún tipo de predicado con el método:

var query = GetAll(x => x.ToString() == "lala"); 

// ... 

public IEnumerable<object> GetAll(Func<object, bool> predicate) 
{ 
    return AllElements.Where(predicate); 
} 
+0

Así que deberíamos usar Func como lo dijo daniel o Func

+1

Bueno, la versión de Daniel es más genérica y flexible, pero dado que 'AllElements' es una' Lista 'entonces' Func 'será suficiente. – LukeH

Cuestiones relacionadas