C # переключатель в лямбда-выражении - PullRequest
17 голосов
/ 16 сентября 2009

Возможно ли иметь переключение в лямбда-выражении? Если нет, то почему? Resharper отобразить это как ошибку.

Ответы [ 6 ]

22 голосов
/ 16 сентября 2009

Вы можете в блоке операторов лямбда:

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

Но вы не можете сделать это в «лямбда-выражении с одним выражением», так что это неверно:

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

Это означает, что вы не можете использовать switch в дереве выражений (по крайней мере, как это сгенерировано компилятором C #; я полагаю, что .NET 4.0 по крайней мере поддерживает его в библиотеках).

10 голосов
/ 16 сентября 2009

В чистом Expression (в .NET 3.5) самое близкое, что вы можете получить, это составное условие:

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

Не весело, особенно когда это становится сложным. Если вы имеете в виду лямда-выражение с телом оператора (только для использования с LINQ-to-Objects), тогда внутри скобок все допустимо:

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

Конечно, вы можете получить работу на стороне; например, LINQ-to-SQL позволяет сопоставить скалярную пользовательскую функцию (в базе данных) с методом в контексте данных (который фактически не используется) - например:

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

где MapType - UDF, выполняющий работу на сервере БД.

7 голосов
/ 16 сентября 2009

Да, это работает, но вы должны поместить свой код в блок. Пример:

private bool DoSomething(Func<string, bool> callback)
{
    return callback("FOO");
}

Затем, чтобы назвать это:

DoSomething(val =>
                {
                    switch (val)
                    {
                        case "Foo":
                            return true;

                        default:
                            return false;
                    }
                });
2 голосов
/ 16 сентября 2009

Я тоже это проверил: -)

[Test]
public void SwitchInLambda()
{
    TakeALambda(i => {
        switch (i)
        {
            case 2:
                return "Smurf";
            default:
                return "Gnurf";
        }
    });
}

public void TakeALambda(Func<int, string> func)
{
    System.Diagnostics.Debug.WriteLine(func(2));
}

Работает просто отлично (выводит "Smurf")!

2 голосов
/ 16 сентября 2009

Хм, я не вижу причин, почему это не должно работать. Просто будьте осторожны с синтаксисом, который вы используете

param => {
    // Nearly any code!
}

delegate (param) {
    // Nearly any code!
}

param => JustASingleExpression (No switches)
0 голосов
/ 07 февраля 2019

enter image description here

Я только учу это:

                      (model) =>
                                {
                                    switch(model.SentInvoiceTypeId)
                                    {
                                        case 1:
                                            return "1 asdf";
                                        case 2:
                                            return "2 asdf";
                                        case 3:
                                            return "3 asdf ";
                                        case 4:
                                            return "4 asdf ";
                                        default:
                                            return "asdf";
                                    }
                                }

Просто вставьте "модель" () и добавьте свой код в {}, не забудьте получить возврат.
Я не уверен, в каких версиях C # будет работать, В этом примере C # 7.0

Надеюсь, этот ответ кому-нибудь поможет.

...