Commutateur C # dans l'expression lambda

c# expression-trees lambda switch-statement

Question

Est-il possible d'avoir un interrupteur dans une expression lambda? Si non, pourquoi? Resharper l'affiche comme une erreur.

Réponse acceptée

Vous pouvez dans un bloc de déclaration lambda:

Action<int> action = x =>
{
  switch(x)
  {
    case 0: Console.WriteLine("0"); break;
    default: Console.WriteLine("Not 0"); break;
  }
};

Mais vous ne pouvez pas le faire dans une "expression unique lambda", donc ceci n'est pas valide:

Action<int> action = x =>
{
  switch(x)
  {
    case 0: Console.WriteLine("0"); break;
    default: Console.WriteLine("Not 0"); break;
  }
};

Cela signifie que vous ne pouvez pas utiliser switch dans une arborescence d'expression (du moins tel que généré par le compilateur C #; je pense qu'au moins .NET 4.0 est pris en charge dans les bibliothèques).


Réponse d'expert

Dans une Expression pure (dans .NET 3.5), le plus proche que vous puissiez obtenir est un composé conditionnel:

    Expression<Func<int, string>> func = x =>
        x == 1 ? "abc" : (
        x == 2 ? "def" : (
        x == 3 ? "ghi" :
                 "jkl")); /// yes, this is ugly as sin...

Pas amusant, surtout quand ça devient complexe. Si vous voulez parler d'une expression lamda avec un corps d'instructions (utilisable uniquement avec LINQ-to-Objects), alors tout est légal à l'intérieur des accolades:

    Expression<Func<int, string>> func = x =>
        x == 1 ? "abc" : (
        x == 2 ? "def" : (
        x == 3 ? "ghi" :
                 "jkl")); /// yes, this is ugly as sin...

Bien sûr, vous pourrez peut-être externaliser le travail; Par exemple, LINQ-to-SQL vous permet de mapper un fichier UDF scalaire (de la base de données) à une méthode du contexte de données (qui n'est pas réellement utilisé) - par exemple:

    Expression<Func<int, string>> func = x =>
        x == 1 ? "abc" : (
        x == 2 ? "def" : (
        x == 3 ? "ghi" :
                 "jkl")); /// yes, this is ugly as sin...

MapType est un MapType UDF qui effectue le travail sur le serveur de base de données.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi