C# expressions lambda comme arguments de la fonction
J'ai été très occupé plongée dans les expressions lambda récemment, et il y a quelques fonctionnalités spécifiques que j'ai eu l'intention d'apprendre, mais ne pouvaient tout simplement pas l'impression de faire des têtes ou queues de.
Supposons que j'ai une suite logique dans mon code:
List<A> foo; //assuming this is populated
string[] bar = foo.Select<A,string>(x => x.StringProperty).ToArray<string>();
Maintenant, je veux peut-être abstraite que l'ensemble de l'opération dans une méthode de gestionnaire, de sorte que je peux faire ceci à la place:
string[] bar = MakeArray<A,string>(foo, x => x.StringProperty);
int[] foobar = MakeArray<A,int>(foo, x => x.IntegerProperty);
Comment m'y prendre avec l'écriture de cette méthode corps? Je prévois de déclarer la signature en tant que quelque chose comme:
U[] MakeArray<T,U>( /* some lambda magic? */ ) where T : IEntity {}
mais je ne sais pas comment spécifier que j'attends d'une expression lambda que l'argument de méthode, et comment cela se traduit exactement dans le corps de la méthode.
Quelqu'un peut-il me montrer comment créer le MakeArray()
fonction ci-dessus? Je suis assez sûr qu'une fois que je vois comment c'est fait, que je peux le ramasser à partir de là.
MODIFIER
Comme l'a souligné dans les commentaires, MakeArray()
besoin d'une référence à la IEnumerable<>
. Mis à jour pour refléter ce fait.
- FWIW l'implicite de la nature des médicaments génériques pouvez ajouter un lisible de la valeur à votre code en n'ayant pas à déclarer explicitement le type avec chacun des énoncés, ce qui pourrait être subjectif bien. La déclaration suivante est égal à votre premier select..
string[] bar = foo.Select(x => x.StringProperty).ToArray();
- Si vous vous trouvez à l'aide de tableaux partout dans votre code, vous pouvez envisager de refactoring en
IEnumerable<T>
ouIList<T>
. Alors rien de tout cela sera nécessaire. Aussi, n'est-ce pasMakeArray
besoin d'une référence à toto? - Ouais, j'ai un peu de tout comme les génériques ont déclaré explicitement (le cas échéant) juste si c'est clair ce que je suis en tirant. Vous avez raison cependant.
- nah, le tableau est juste pour illustrer. Mais, je vois votre point de bien!
Vous devez vous connecter pour publier un commentaire.
Essayez ce qui suit
Lors du passage des lambdas comme arguments que généralement vous voulez le paramètre correspondant à un délégué. Dans la plupart des cas, vous devez simplement utiliser le
Action<>
ouFunc<>
valeur. L'ancienne pour les nuls retour lambdas, et la seconde pour ceux qui les valeurs de retour.Vous êtes à la recherche pour
Action<>
etFunc<>
.Vous pouvez utiliser la touche Func et l'Action des classes. Découvrez le LINQ Où la fonction de signature pour un exemple:
http://msdn.microsoft.com/en-us/library/bb534803.aspx
Vous pouvez créer une extension de
Et de l'utiliser ensuite comme ce