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:

// This won't work
Expression<Func<int, int>> action = x =>
  switch(x)
  {
    case 0: return 0;
    default: return x + 1;
  };

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:

    Func<int, string> func = x => {
        switch (x){
            case 1:  return "abc";
            case 2:  return "def";
            case 3:  return "ghi";
            default: return "jkl";
        }
    };

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:

var qry = from cust in ctx.Customers
          select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };

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