Чи може вираз C # лямбда мати більше одного твердження?


131

Чи може вираз C # лямбда включати більше одного твердження?

(Редагувати. Як згадується у кількох відповідях нижче, це питання спочатку ставилося про "рядки", а не про "заяви".)


17
Так, ви можете використовувати кілька рядків. Я не вважаю правильним, роблячи це повною відповіддю.
Тессерекс

1
@Tesserex - що не зробить це відповіддю ... ти маєш рацію!
RQDQ

3
@RQDQ Оскільки це питання так чи ні, я не відчуваю, що він гідний повторення, яке він би створив з результатів.
Тессерекс

Відповіді:


195

Звичайно:

List<String> items = new List<string>();

var results = items.Where(i => 
            {
                bool result;

                if (i == "THIS")
                    result = true;
                else if (i == "THAT")
                    result = true;
                else
                    result = false;

                return result;
            }
        );

31

(Я припускаю, що ви дійсно говорите про кілька заяв, а не про кілька рядків.)

Ви можете використовувати кілька висловлювань у лямбда-виразі за допомогою дужок, але лише синтаксис, який не використовує дужки, може бути перетворений у дерево виразів:

// Valid
Func<int, int> a = x => x + 1;
Func<int, int> b = x => { return x + 1; };        
Expression<Func<int, int>> c = x => x + 1;

// Invalid
Expression<Func<int, int>> d = x => { return x + 1; };

1
Я намагаюся зрозуміти, чому Func дозволяє дужки, а Expression не дозволяє. У будь-якому випадку Вираз буде виконуватись як Func, чи є спосіб додати логіку декількох ліній до дерева виразів? Якщо ні, то чому це обмежують?
Хавіб

8
@Habeeb: "У будь-якому випадку Вираз буде виконано як Func" Не завжди. Багато часу він взагалі ніколи не збирається до делегата - просто розглядається як дані. Дерева виразів у .NET 4.0 отримали можливість включати кілька висловлювань через Expression.Block, але мова C # не підтримує цього. Це могло б, але це вимагало б більшої роботи з проектування / впровадження / тестування.
Джон Скіт

26

Ви можете помістити стільки нових рядків, скільки вам потрібно, в лямбда-вираз; C # ігнорує нові рядки.

Ви, мабуть, мали намір запитати про кілька заяв .

Кілька заяв можна загорнути в дужки.

Дивіться документацію .


17
Чи не було б точніше сказати, що C # обробляє всі пробіли, включаючи нові рядки, однаково? Це звучить трохи оманливо, якщо говорити, що він ігнорує нові рядки - це здається, що це просто викреслює їх повністю, і ви можете розділити ключове слово на новий рядок чи щось таке.
Тессерекс

6

З моменту C # 7:

Один рядок:

int expr(int x, int y) => x + y + 1; 

Багаторядковий вислів:

int expr(int x, int y) { int z = 8; return x + y + z + 1; };

хоча вони називаються локальними функціями, я думаю, що це виглядає дещо чіткіше, ніж наступні, і фактично те саме

Func<int, int, int> a = (x, y) => x + y + 1;

Func<int, int, int> b = (x, y) => { int z = 8; return x + y + z + 1; };

4
Func<string, bool> test = (name) => 
{
   if (name == "yes") return true;
   else return false;
}

5
Func <string, bool> test = name => name == "так";
asawyer

3
Політика демонструє багаторядковий формат, запитуваний запитанням, не розважаючи про пропозиції щодо гольфу. Для реалізації вашого мудрого коду було б це "не відповідь"!
Caius Jard


0

З c # 7.0 Ви можете також користуватися цим

Public string ParentMethod(int i, int x){
    int calculation = (i*x);
    (string info, int result) InternalTuppleMethod(param1, param2)
    {
        var sum = (calculation + 5);
        return ("The calculation is", sum);
    }
}

0

Скажімо, у вас клас:

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }
    }

З C # 7.0 всередині цього класу ви можете це робити навіть без фігурних дужок:

Action<int, int> action = (x, y) => (_, _) = (X += x, Y += y);

і

Action<int, int> action = (x, y) => _ = (X += x, Y += y);

буде те саме, що:

Action<int, int> action = (x, y) => { X += x; Y += y; };

Це також може бути корисним, якщо вам потрібно записати звичайний метод або конструктор в один рядок або коли вам потрібно спакувати більше одного оператора / виразу для одного виразу:

public void Action(int x, int y) => (_, _) = (X += x, Y += y);

або

public void Action(int x, int y) => _ = (X += x, Y += y);

або

public void Action(int x, int y) => (X, Y) = (X + x, Y + y);

Детальніше про деконструкцію кортежів у документації .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.