Bisakah ekspresi C # lambda memiliki lebih dari satu pernyataan?


131

Bisakah ekspresi C # lambda menyertakan lebih dari satu pernyataan?

(Sunting: Seperti yang dirujuk dalam beberapa jawaban di bawah, pertanyaan ini awalnya bertanya tentang "baris" dan bukan "pernyataan".)


17
Ya, Anda bisa menggunakan banyak baris. Saya merasa tidak benar untuk menjadikannya jawaban yang lengkap.
Tesserex

1
@Tesserex - apa yang tidak membuatnya menjadi jawaban ... Anda benar!
RQDQ

3
@RQDQ Karena ini pertanyaan ya atau tidak, saya tidak merasa layak untuk rep yang dihasilkannya dari upvotes.
Tesserex

Jawaban:


195

Tentu:

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

(Saya berasumsi Anda benar-benar berbicara tentang banyak pernyataan daripada beberapa baris.)

Anda bisa menggunakan banyak pernyataan dalam ekspresi lambda menggunakan tanda kurung, tetapi hanya sintaks yang tidak menggunakan tanda kurung yang dapat dikonversi menjadi pohon ekspresi:

// 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
Saya mencoba memahami mengapa Func memungkinkan kawat gigi dan Ekspresi tidak memungkinkan. Pokoknya Ekspresi akan dipenuhi sebagai Func, Apakah ada cara untuk menambahkan beberapa logika baris ke Pohon Ekspresi? Jika tidak, mengapa ada pembatasan itu?
Habeeb

8
@Habeeb: "Pokoknya Ekspresi akan memenuhi fungsi" Tidak selalu. Banyak waktu yang tidak pernah dikompilasi untuk delegasi sama sekali - hanya diperiksa sebagai data. Pohon ekspresi di NET 4.0 melakukan memperoleh kemampuan untuk menyertakan beberapa pernyataan melalui Expression.Block tapi C # bahasa tidak mendukung itu. Itu bisa, tetapi itu akan membutuhkan lebih banyak desain / implementasi / pekerjaan uji.
Jon Skeet

26

Anda dapat menempatkan baris baru sebanyak yang Anda inginkan dalam ekspresi lambda; C # mengabaikan baris baru.

Anda mungkin bermaksud bertanya tentang banyak pernyataan .

Berbagai pernyataan dapat dibungkus dengan kawat gigi.

Lihat dokumentasi .


17
Bukankah lebih tepat mengatakan C # memperlakukan semua spasi putih, termasuk baris baru, secara merata? Kedengarannya agak menyesatkan untuk mengatakan itu mengabaikan baris baru - itu membuatnya tampak seperti menghapusnya sepenuhnya, dan Anda dapat membagi kata kunci di baris baru atau sesuatu.
Tesserex

6

Sejak C # 7:

Pernyataan garis tunggal:

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

Pernyataan multiline:

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

walaupun ini disebut fungsi lokal saya pikir ini terlihat sedikit lebih bersih daripada yang berikut dan secara efektif sama

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
Polity menunjukkan format multi-garis yang diminta oleh pertanyaan, bukan menghibur saran golf. Untuk menerapkan kode bijak Anda akan membuatnya "bukan jawaban"!
Caius Jard


0

Dengan c # 7.0 Anda dapat menggunakan seperti ini juga

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

Katakanlah Anda memiliki kelas:

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

Dengan C # 7.0 di dalam kelas ini Anda dapat melakukannya bahkan tanpa tanda kurung:

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

dan

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

akan sama dengan:

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

Ini juga mungkin berguna jika Anda perlu menulis metode atau konstruktor reguler dalam satu baris atau ketika Anda membutuhkan lebih dari satu pernyataan / ekspresi untuk dikemas dalam satu ekspresi:

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

atau

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

atau

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

Lebih lanjut tentang dekonstruksi tupel dalam dokumentasi .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.