2009-10-21 13 views
2

Je travaille sur un tutoriel C#/ASP.NET et je rencontre un opérateur que je n'avais jamais vu auparavant.Que fait l'opérateur =>?

return RSVPs.Any(r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase)); 

Qu'est-ce que => signifie dans cette ligne de code ??

+0

Son un double en stackoverflow: [http://stackoverflow.com/questions/1415444/c-3-0-meaning-of-expression/1415470# 1415470] (http://stackoverflow.com/questions/1415444/c-3-0-meaning-of-expression/1415470#1415470) – anishMarokey

Répondre

2

Ceci est une expression lambda. Dans l'exemple que vous avez donné "r" est un élément de la liste. Ce code va itérer votre liste [RSVPs] à la recherche d'un "r" où le AttendeeName est le même que celui de votre userName. Pour comprendre ce qui se passe, vous devez comprendre les délégués, mais essentiellement la version de Coles Notes est que le paramètre à gauche de => (r dans ce cas) est un élément de la liste [RSVPs] est itéré de manière séquentielle, pour chaque instance de r, vous vérifiez quelque chose. Du point de vue de l'utilisateur, c'est vaguement équivalent à:

public bool HasRSVP(List<RSVP> RSVPs, string userName) 
{ 
    foreach(RSVP r in RSVPs) 
     if(r.AttendeeName.Equals(userName, StringComparison.InvariantCulture)) 
      return true; 
    return false; 
} 
+0

Y a-t-il une raison d'utiliser l'expression lambda au lieu du code que vous avez donné? Votre code est beaucoup plus facile à lire, pour moi quand même. – Lumpy

+1

Certes, pour un utilisateur qui est nouveau pour les expressions et delgates lambda, mon code semble plus facile à lire. Cependant, une fois que vous vous serez habitué à lancer des délégués et des expressions lambda (qui viendront dans le temps), cela vous surprendra que les expressions lambda deviennent plus intuitives et donc plus faciles à lire que la version longue. – BobTheBuilder

+0

Je ne sais pas si vous avez une expérience de base de données, mais cela revient à dire: return Exists (Sélectionnez r From RSVPs Où r.AttendeeName = @userName); Les expressions lambda vous donnent le pouvoir d'être plus expressif dans une plus petite quantité de code. – BobTheBuilder

3

C'est la syntaxe qui définit une expression lambda. Il est essentiellement raccourci pour un délégué/méthode anonyme en C#

Func<int,int> add2 = x => x + 2; 
int value = add2(42); // value == 44 

Dans cet exemple particulier, il définit un délégué qui prend une instance de RSVP et renvoie true si la valeur AttendeeName est égale à la userName transmise. La Toute extension La méthode renvoie true si le délégué passé est true pour toute valeur de la collection.

Voici une façon dilatée d'écrire l'échantillon que vous avez posté

Func<RSPV,bool> del = r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase); 
return RSVPS.Any(del); 
+0

Y a-t-il une raison pour laquelle cela vaut mieux qu'une boucle foreach qui se ferme une fois qu'elle trouve une correspondance ? Je l'utilise pour la lisibilité du code? la vitesse? – Lumpy

+0

Si l'OP vient juste de rencontrer "=>" alors peut-être que votre Func a aussi besoin d'explications. J'utilise Lambdas tout le temps, mais je dois admettre que lorsque je commence à voir Funcs, je commence à être agité. – BobTheBuilder

0

=> fait partie d'une expression lambda, associant l'argument (s) à sa gauche avec une expression/déclaration à son droit. Selon la façon dont il est utilisé, il peut représenter un délégué anonyme:

return RSVPs.Any(delegate (RSVP r) { r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase) }); 

ou un arbre d'expression équivalente:

Expression<Func<RSVP, bool>> e = r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase); 
1

Toutes les expressions lambda utilisent l'opérateur lambda =>, qui est lu comme " va à ". Le côté gauche de l'opérateur lambda spécifie les paramètres d'entrée (le cas échéant) et le côté droit contient l'expression ou le bloc d'instructions. L'expression lambda x => x * x est lue "x va à x fois x". Cette expression peut être attribué à un type délégué comme suit:

delegate int del(int i); 
static void Main(string[] args) 
{ 
    del myDelegate = x => x * x; 
    int j = myDelegate(5); //j = 25 
} 

http://msdn.microsoft.com/en-us/library/bb397687.aspx

Func<int, bool> myFunc = x => x == 5; 
bool result = myFunc(4); // returns false of course 
+0

Je pense que "va à" est un peu trompeur dans le contexte de l'exemple, c'est plus comme le SQL "Select ListItem où ListItem.AttendeeName = userName" – BobTheBuilder

+0

Prenez-le avec MSDN, puisque je viens de copier et coller de la documentation. :) –

2

Il définit un lambda expression.

r => r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase) 

est équivalent à

delegate(RSVP r) { return r.AttendeeName.Equals(userName, StringComparison.InvariantCultureIgnoreCase); }