11
votes

C # Sortie générique foreach qui utilise lambda

Est-ce que quelqu'un sait s'il est possible de sortir d'un médicament générique qui utilise Lambda? E.G.

someList.ForEach(sl =>
  {
    if (sl.ToString() == "foo")
        break;

    // continue processing sl here
    // some processing code
  }
);


6 commentaires

Y a-t-il une raison pour laquelle il doit être fait de cette façon? J'ai toujours été méfiant de pause; . En dehors d'un cas de commutation, je n'ai jamais vu de les utiliser.


J'utilise break et Continuer beaucoup. Parfois, vous ne voulez pas que le corps de la boucle soit exécutant tout ce qu'il passe, et pause / Continuer simplifie le code.


Y a-t-il une raison pour laquelle vous préférez une expression de Lambda pour cela?


@LoadMaster: Je suis curieux, avez-vous trouvé du code où le seul moyen d'empêcher le reste du corps de l'exécution était avec une pause / continue? Rien d'autre n'aurait atteint le même effet?


En termes de style, si (condition) continue; est un nettoyeur imo que if (! Condition) {corps de la boucle}


@FrustratedwithFormsDesigner: Bien sûr, c'est Toujours possible d'écrire du code sans Break ou Continuer . Mais cela peut entraîner un code plus verbeux, moins compréhensible et moins efficace. break et Continuer ont été conçus afin que vous puissiez écrire un code concis et efficace dans des situations inhabituelles.


4 Réponses :


18
votes

Bien sûr. Mais d'abord, notez que je recommande contre cela; Je dis qu'un opérateur de séquence ne doit pas avoir d'effet secondaire et une déclaration doit avoir un effet secondaire. Si vous faites quelque chose dans celui de la Lambda, alors faites-en une déclaration dans le corps d'une boucle de foresach plutôt que de le faire ressembler à un opérateur de séquence.

Cela dit, voici ce que vous faites. Premièrement, vous vous écrivez un pourbeach qui fonctionne sur des séquences arbitraires, pas seulement des listes: p> xxx pré>

et maintenant vous écrivez votre pause comme ceci: p>

someList
    .TakeWhile(x=>x.ToString() != "foo")
    .ForEach(sl=>
    {/*your action here*/});


0 commentaires

10
votes

de MSDN

Les règles suivantes s'appliquent à la variable Portée dans les expressions Lambda:

snip

Une expression de Lambda ne peut pas contenir de déclaration goto, déclaration de pause, ou Continuer la déclaration dont la cible est en dehors du corps ou dans le corps d'un Fonction anonyme contenue.

Je ne sais pas si cela aide à donner le code que vous avez posté. Le devis correspondant est à partir de la fin de l'article MSDN.


1 commentaires

La réponse la plus pertinente et la plus complète encore. Je l'aime bien!



2
votes

AVERTISSEMENT: le code ci-dessous ne doit pas être pris au sérieux et est fourni à des fins de divertissement uniquement!

Vous pouvez «simuler» une suite avec un retour rapide comme celui-ci: P>

Enumerable.Range(1, 20)
          .ForEach(n =>
                {
                    if (n == 10) return;
                    Console.WriteLine("This is not 10: {0}", n);
                });


0 commentaires

0
votes

à quoi ça se passe? XXX


0 commentaires