Biểu thức lambda C # có thể có nhiều hơn một câu không?


131

Biểu thức lambda C # có thể bao gồm nhiều hơn một câu không?

(Chỉnh sửa: Như được tham chiếu trong một số câu trả lời dưới đây, câu hỏi này ban đầu được hỏi về "dòng" thay vì "câu lệnh".)


17
Có, bạn có thể sử dụng nhiều dòng. Tôi không cảm thấy đúng làm cho nó một câu trả lời đầy đủ.
Tesserex

1
@Tesserex - những gì không làm cho nó một câu trả lời ... bạn đúng!
RQDQ

3
@RQDQ Bởi vì đó là câu hỏi có hoặc không, tôi không cảm thấy nó xứng đáng với đại diện mà nó sẽ tạo ra từ upvote.
Tesserex

Câu trả lời:


195

Chắc chắn rồi:

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

(Tôi cho rằng bạn thực sự đang nói về nhiều câu lệnh hơn là nhiều dòng.)

Bạn có thể sử dụng nhiều câu lệnh trong biểu thức lambda bằng cách sử dụng dấu ngoặc nhọn, nhưng chỉ có thể chuyển đổi cú pháp không sử dụng dấu ngoặc nhọn thành cây biểu thức:

// 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
Tôi đang cố gắng để hiểu tại sao Func cho phép niềng răng và Biểu hiện không cho phép. Anyway Expression sẽ tuân thủ Func, Có cách nào để thêm logic nhiều dòng vào Cây biểu hiện không? Nếu không, tại sao có hạn chế đó?
Habeeb

8
@Habeeb: "Anyway Expression sẽ tuân thủ Func" Không phải lúc nào cũng vậy. Rất nhiều thời gian nó không bao giờ được biên soạn cho một đại biểu nào cả - chỉ xem xét dưới dạng dữ liệu. Cây biểu thức trong .NET 4.0 đã đạt được khả năng bao gồm nhiều câu lệnh thông qua Expression.Block nhưng ngôn ngữ C # không hỗ trợ điều đó. Nó có thể, nhưng điều đó sẽ đòi hỏi nhiều công việc thiết kế / thực hiện / kiểm tra hơn.
Jon Skeet

26

Bạn có thể đặt bao nhiêu dòng mới như bạn muốn trong một biểu thức lambda; C # bỏ qua các dòng mới.

Bạn có thể có nghĩa là để hỏi về nhiều câu .

Nhiều câu lệnh có thể được bọc trong dấu ngoặc nhọn.

Xem tài liệu .


17
Sẽ không chính xác hơn khi nói C # đối xử với tất cả các khoảng trắng, bao gồm cả dòng mới, bằng nhau? Nghe có vẻ hơi sai lầm khi nói rằng nó bỏ qua các dòng mới - nó làm cho có vẻ như nó chỉ loại bỏ chúng hoàn toàn, và bạn có thể chia một từ khóa trên một dòng mới hoặc một cái gì đó.
Tesserex

6

Kể từ C # 7:

Tuyên bố dòng đơn:

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

Tuyên bố đa dòng:

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

Mặc dù chúng được gọi là các hàm cục bộ nhưng tôi nghĩ rằng cái này trông sạch hơn một chút so với các hàm sau và thực sự giống nhau

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 <chuỗi, bool> test = name => name == "có";
asawyer

3
Polity đang thể hiện định dạng nhiều dòng được yêu cầu bởi câu hỏi, không mang tính giải trí cho các đề xuất chơi gôn. Để thực hiện mã khôn ngoan của bạn sẽ làm cho nó "không phải là một câu trả lời"!
Caius Jard


0

Với c # 7.0 Bạn cũng có thể sử dụng như thế này

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

Giả sử bạn có một lớp học:

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

Với C # 7.0 bên trong lớp này, bạn có thể làm điều đó ngay cả khi không có dấu ngoặc nhọn:

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

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

sẽ giống như:

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

Điều này cũng có thể hữu ích nếu bạn cần viết một phương thức hoặc hàm tạo thông thường trong một dòng hoặc khi bạn cần nhiều hơn thì một câu lệnh / biểu thức sẽ được đóng gói thành một biểu thức:

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

hoặc là

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

hoặc là

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

Thông tin thêm về giải cấu trúc của bộ dữ liệu trong tài liệu .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.