C#のラムダ式に複数のステートメントを含めることはできますか?


131

C#のラムダ式に複数のステートメントを含めることはできますか?

(編集:以下のいくつかの回答で参照されているように、この質問は当初、「ステートメント」ではなく「行」について尋ねられました。)


17
はい、複数の行を使用できます。私はそれを完全な答えにするのは正しくないと思います。
Tesserex、2011

1
@Tesserex-それを答えにしないでください...あなたは正しいです!
RQDQ 2011

3
@RQDQこれは「はい」または「いいえ」の質問なので、賛成票から生成される担当者に値するものではないと思います。
Tesserex、2011

回答:


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として準拠します。式ツリーに複数の行ロジックを追加する方法はありますか?いいえの場合、なぜそれを制限しているのですか?
Habeeb 2018年

8
@Habeeb:「とにかく式はFuncとして準拠します」常にではありません。ほとんどの場合、デリゲートにコンパイルされることはありません。データとして調べられるだけです。.NET 4.0の式ツリーは、経由して複数のステートメントを含める機能獲得しましたExpression.Blockをが、C#の言語はそれをサポートしていません。それは可能ですが、より多くの設計/実装/テスト作業が必要になります。
Jon Skeet、2018年

26

ラムダ式には、必要なだけ改行を入れることができます。C#は改行を無視します。

おそらく、複数のステートメントについて質問するつもりでした。

複数のステートメントを中括弧で囲むことができます。

ドキュメントを参照してください。


17
C#が改行を含むすべての空白を同等に扱うと言った方が正確ではないでしょうか?改行を無視するというのは少し誤解を招くように聞こえます-改行を完全に取り除くだけのように見え、キーワードを改行または何かに分割することができます。
Tesserex、2011

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 == "yes";
asawyer

3
政治は質問によって要求された複数行の形式を示しており、ゴルフの提案を面白いものではありません。あなたの賢いコードを実装することは、それを「答えではない」ようにするでしょう!
Caius Jard 2017年


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; };

これは、通常のメソッドまたはコンストラクターを1行で記述する必要がある場合、または1つ以上のステートメント/式を1つの式にパックする必要がある場合にも役立ちます。

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);

ドキュメントのタプルの分解についての詳細。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.