C # -Schalter in Lambda-Ausdruck

c# expression-trees lambda switch-statement

Frage

Ist es möglich, einen Lambda-Ausdruck zu wechseln? WENN nicht, warum? Resharper zeigt dies als Fehler an.

Akzeptierte Antwort

Sie können in einer Anweisung Lambda blockieren:

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

Aber Sie können es nicht in einem "einzigen Ausdruck Lambda" tun, also ist das ungültig:

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

Das bedeutet, dass Sie den Schalter nicht in einem Ausdrucksbaum verwenden können (zumindest so, wie er vom C # -Compiler erzeugt wird; ich glaube, .NET 4.0 hat zumindest Unterstützung dafür in den Bibliotheken).


Expertenantwort

In einem reinen Expression (in .NET 3.5) ist die nächste Bedingung, die Sie erhalten können, eine zusammengesetzte Bedingung:

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

Nicht lustig, besonders wenn es kompliziert wird. Wenn Sie einen Lamda-Ausdruck mit einem Anweisungskörper (nur zur Verwendung mit LINQ-to-Objects) meinen, dann ist alles innerhalb der geschweiften Klammern zulässig:

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

Natürlich könnten Sie die Arbeit auslagern. Mit LINQ-to-SQL können Sie z. B. eine skalare UDF (in der Datenbank) einer Methode im Datenkontext zuordnen (die nicht tatsächlich verwendet wird). Beispiel:

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

MapType ist eine UDF, die die Arbeit auf dem MapType .




Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum