2011-09-01 15 views
6

El siguiente código es parte de la autorización. Estoy tratando de imaginar mentalmente lo que realmente hace, pero de alguna manera no pude.¿Alguien podría explicarme esta expresión lambda? Es amable ponerme loco

IsAuthorized = ((x, y) => x.Any(z => y.Contains(z))); 

¿Alguien podría explicarme esta expresión lambda?

Gracias!

Editar:

IsAuthorized es un tipo de delegado. El programador anterior que codifica esto parece querer mantenerlo en secreto al colocar delegado al final del archivo cs.

El código actual es:

public delegate bool IsAuthorized(IEnumerable<Int32> required, IEnumerable<Int32> has); 
IsAuthorized = ((x, y) => x.Any(z => y.Contains(z))); 
+0

estoy algo confundido por la 'z' aquí. ¿Qué significa z para xey? – wei

+2

z es identificador para cada elemento en x colección. Se llamará al método Contains() para cada elemento en x. z proporciona el elemento actual en la enumeración para y.Contains() –

+0

¿es esto incluso válido (suponiendo que sea C#, debido a la etiqueta .net)? ya que no hay contexto en lo que xey son – BlackTigerX

Respuesta

15

Claro - que está diciendo recibe un par (x, y), hace x contienen ningún valor tal que y contiene ese valor.

Me parece que realmente está diciendo "¿hay alguna intersección entre x y y".

Así que una alternativa sería probablemente:

IsAuthorized = (x, y) => x.Intersect(y).Any(); 

Es muy posible que eso no funcionaría, dependiendo del tipo de IsAuthorized, pero esperamos que sea correcta.

3

para ir con la explicación de Jon, aquí está (con suerte) una muestra equivalente de salidas:

static void Main(string[] args) 
    { 
     int[] i = new int[] { 1, 2, 3, 4, 5 }; 
     int[] j = new int[] { 5, 6, 7, 8, 9 }; 
     int[] k = new int[] { 0, 6, 7, 8, 9 }; 

     bool jContainsI = i.Any(iElement => j.Contains(iElement)); 
     bool kContainsI = i.Any(iElement => k.Contains(iElement)); 

     Console.WriteLine(jContainsI); // true 
     Console.WriteLine(kContainsI); // false 
     Console.Read(); 
    } 

Básicamente, es cualquier elemento de i en j o k. Esto supone que sus parámetros x y y son colecciones de cierta variedad.

intersección es una alternativa válida aquí:

bool iIntersectsJ = i.Intersect(j).Any(); // true 
bool iIntersectsK = i.Intersect(k).Any(); // false 
+2

Como nota al margen, sería mejor hacer: 'i.Intersectar (j) .Any()' en lugar de 'i.Intersect (j) .Count ()> 0' ya que Count() enumerará todo el 'IEnumerable' para contar el número de ocurrencias, mientras que el método Any() simplemente comprobará si el' IEnumerable' no está vacío. Mucho más rápido y más limpio. –

+0

@Joshua muy cierto, gracias por el aviso - ¡Me temo que lo tiré sin pensarlo mucho! –

Cuestiones relacionadas