2011-09-01 14 views
6

Poniższy kod jest częścią autoryzacji. Próbuję mentalnie zobrazować to, co on faktycznie robi, ale nie mógł jakoś.Czy ktoś mógłby wyjaśnić mi to wyrażenie lambda? To miło doprowadza mnie do szału

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

Czy ktokolwiek mógłby wyjaśnić mi to wyrażenie lambda?

Dzięki!

Edit:

IsAuthorized to typ delegata. Poprzedni programista, który o tym pisze, chce zachować to w tajemnicy, umieszczając delegata na końcu pliku cs.

Rzeczywisty kod jest:

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

jestem trochę zdezorientowany przez 'z' tutaj. Co oznacza z oznacza x i y? – wei

+2

z to identyfikator dla każdego elementu w zbiorze x. Metoda Contains() zostanie wywołana dla każdego elementu wx. z dostarcza bieżący element w wyliczeniu dla y.Contains() –

+0

czy jest to poprawne (zakładając, że jest to C#, ze względu na znacznik .net)? ponieważ nie ma kontekstu co xiy są – BlackTigerX

Odpowiedz

15

Jasne - to powiedzenie podano parę (x, y), robi x zawiera żadnych wartości takie, że y zawiera tę wartość.

Wygląda na to, że tak naprawdę mówi "czy jest jakieś skrzyżowanie między x i y".

więc alternatywą będzie prawdopodobnie:

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

To jest po prostu możliwe, że nie będzie działać, w zależności od rodzaju IsAuthorized, ale spodziewam się, że jest poprawne.

3

Aby przejść z objaśnieniem Jona, tutaj (oby) równoważną próbką z wyjść:

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

Zasadniczo, jakikolwiek element i w j lub k. Zakłada się, że parametry x i y są kolekcjami pewnego rodzaju.

Skrzyżowanie jest alternatywą tutaj:

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

Na marginesie, byłoby lepiej zrobić: 'i.Intersect (j) .Any()' zamiast 'i.Intersect (j) .Count ()> 0', ponieważ Count() wyliczy całe 'IEnumerable', aby policzyć liczbę wystąpień, podczas gdy metoda Any() po prostu sprawdzi, czy' IEnumerable' nie jest pusta. O wiele szybszy i czystszy wygląd. –

+0

@Joshua bardzo prawdziwe, dzięki za heads up - obawiam się, że rzuciłem to bez większego zastanowienia! –

Powiązane problemy