Переключатель С# в выражении лямбда
Возможно ли иметь переключатель в лямбда-выражении? Если нет, то почему? Resharper отображает это как ошибку.
Ответы
Ответ 1
Вы можете в блоке оператора lambda:
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;
};
Это означает, что вы не можете использовать переключатель в дереве выражений (по крайней мере, сгенерированный компилятором С#, я считаю, что .NET 4.0 по крайней мере поддерживает его в библиотеках).
Ответ 2
В чистом 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...
Не весело, особенно когда он становится сложным. Если вы имеете в виду выражение lamda с телом оператора (только для использования с 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 позволяет сопоставить скалярный UDF (в базе данных) метод в контексте данных (который фактически не используется) - например:
var qry = from cust in ctx.Customers
select new {cust.Name, CustomerType = ctx.MapType(cust.TypeFlag) };
где MapType
- это UDF, который выполняет работу на сервере db.
Ответ 3
Да, это работает, но вы должны поместить свой код в блок. Пример:
private bool DoSomething(Func<string, bool> callback)
{
return callback("FOO");
}
Затем, чтобы называть его:
DoSomething(val =>
{
switch (val)
{
case "Foo":
return true;
default:
return false;
}
});
Ответ 4
Хм, я не вижу причин, почему это не должно работать. Просто будьте осторожны с синтаксисом, который вы используете
param => {
// Nearly any code!
}
delegate (param) {
// Nearly any code!
}
param => JustASingleExpression (No switches)
Ответ 5
Я тоже проверил: -)
[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" )!
Ответ 6
![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";
}
}
Просто вставьте "model"() и добавьте свой код в {}, не забудьте получить возврат.
Я не уверен, в каких версиях С# будет работать, В этом примере С# 7.0
Я надеюсь, что этот ответ может кому-то помочь.