2012-01-15 28 views
20

en una entrevista, el entrevistador me pregunta siguiente consultaCómo funciona Lambda Expresión

int[] array = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
Func<int, int> func = i => 
{ 
    Console.Write(array[i]); 
    return i; 
}; 

var result = array.Where(e => e <= func(2)).ToArray(); 

por lo que me va a guiar a cualquiera cómo e <= func(2) cosa funciona? y como última línea es decir

var result = array.Where(e => e <= func(2)).ToArray(); 

obras?

+1

Investigue 'Closures', o posiblemente' Predicates', según su confusión. –

+1

¿Dónde está exactamente tu confusión? ¿Qué no entiendes? – svick

+4

Creo que el entrevistador intentaba engañarte con dos flechas. –

Respuesta

7

Puede ser más fácil de entender si se utilizan paréntesis:

var result = array.Where(e => (e <= func(2))).ToArray(); 

Este

e => ... 

Construcciones de una función que toma un argumento.

Este

e <= func(2) 

compara e-func(2). func(2) llama a la función func con el argumento 2.

Con todo, el <= no tiene nada que ver con =>. Son dos operadores completamente diferentes. Para resumir ... => ..., construye una función. ... <= ... compara los argumentos.

+12

En otras palabras, '=>' es una mala aproximación de "⇒" y '<=' es una peor aproximación de "≤". –

+0

@lasseespeholt ... thnx ... contesta mi respuesta en tu respuesta ... de nuevo ... – Usman

+0

@ user842218 De nada :) –

2

Significa para todos e donde e es más pequeño o igual que func (2). Los ToArray() resultados de llamadas en una evaluación de la expresión LINQ, por lo 3333333333 se imprime en la consola

+1

'23' se imprime? Yo habría adivinado '3333333333' –

+1

El func (2) siempre muestra el tercer elemento de la matriz (3) y se evalúa para cada elemento de la matriz, por lo tanto, muestra 3333333333 – nan

+0

Para mí, parece que el resultado 1,2, 3 será, considerando que el argumento es 2. – Tigran

1

Where() es un LINQ query que filtra una matriz sobre la base de una prueba contenida en su parámetro de expresión lambda.

e => e <= func(2), es una expresión lambda que se pasa a la consulta Where() tomar cada elemento en array y añadir ese elemento a result si el valor es menor que o igual a ("< =") func (2) .

ToArray() es un operador de conversión que actúa como un molde de IEnumerable a array.

Para obtener más información sobre LINQ, consulte here.

4

Func<int, int> significa que func es una función con un parámetro de tipo int y resultado de tipo int. El i es el parámetro. La función escribe el elemento de la matriz en la consola y devuelve el parámetro sin modificar.

La función Where devuelve todos los casos que coinciden con el predicado dado, ToArray hace una matriz de IEnumerable devuelto por Where (lea sobre linq). e => e <= func(2) es una función con un parámetro de tipo int (igual que el tipo de colección) y con el resultado de tipo bool. Se puede escribir como una función normal:

bool Foo(int e) { 
    return e <= func(2); 
} 

Y puesto func devuelve un parámetro sin modificar, es igual funcionalmente a

bool Foo(int e) { 
    return e <= 2; 
} 

pero sin importarle el efecto secundario.

+0

Excelente respuesta. ¡Similar a lo que iba a publicar! :) – gideon

+0

@Dmitry Polyanitsa ... ¿podría decirme por favor en Func , qué parámetro es para la devolución? ¿Y cuál es para la entrada? – Usman

+0

El primero para la entrada, el segundo para el resultado: http://msdn.microsoft.com/en-us/library/bb549151.aspx –

4

Si nos fijamos en las posibles combinaciones de = y < o > en C#:

  • <= es el operador "menor o igual"
  • >= es el operador "mayor o igual"
  • => es el operador lambda, a la izquierda están los parámetros de la lambda, a la derecha está el cuerpo
  • =< no es val id, no existe tal operador