Ngắt / thoát được lồng cho trong vb.net


122

Làm cách nào để thoát khỏi vòng lặp for hoặc lồng nhau trong vb.net?

Tôi đã thử sử dụng thoát cho nhưng nó nhảy hoặc bị hỏng chỉ một vòng lặp for mà thôi.

Làm cách nào tôi có thể thực hiện nó cho những điều sau:

for each item in itemList
     for each item1 in itemList1
          if item1.text = "bla bla bla" then
                exit for
          end if
     end for
end for

Những gì VB thực sự cần là một Exit For itembiến thể của câu lệnh, tương tự như Next item. Trong "những ngày xưa tốt đẹp", bạn có thể rõ ràng Nextlà vòng lặp bên ngoài. Hôm nay, VB đưa ra một lỗi. Tất nhiên, nó mang tính "xây dựng" hơn Exit For.
ysap

Câu trả lời:


199

Thật không may, không có exit two levels of fortuyên bố nào , nhưng có một số cách giải quyết để thực hiện những gì bạn muốn:

  • Goto . Nói chung, việc sử dụng gotođược coi là hành vi xấu (và đúng là như vậy), nhưng gotochỉ sử dụng để chuyển tiếp ra khỏi các câu lệnh điều khiển có cấu trúc thường được coi là ổn, đặc biệt nếu giải pháp thay thế là có mã phức tạp hơn.

    For Each item In itemList
        For Each item1 In itemList1
            If item1.Text = "bla bla bla" Then
                Goto end_of_for
            End If
        Next
    Next
    
    end_of_for:
    
  • Khối ngoài giả

    Do
        For Each item In itemList
            For Each item1 In itemList1
                If item1.Text = "bla bla bla" Then
                    Exit Do
                End If
            Next
        Next
    Loop While False
    

    hoặc là

    Try
        For Each item In itemlist
            For Each item1 In itemlist1
                If item1 = "bla bla bla" Then
                    Exit Try
                End If
            Next
        Next
    Finally
    End Try
    
  • Chức năng riêng biệt : Đặt các vòng lặp bên trong một chức năng riêng biệt, có thể được thoát bằng return. Tuy nhiên, điều này có thể yêu cầu bạn truyền rất nhiều tham số, tùy thuộc vào số lượng biến cục bộ bạn sử dụng bên trong vòng lặp. Một giải pháp thay thế sẽ là đặt khối vào một lambda nhiều dòng, vì điều này sẽ tạo ra sự đóng đối với các biến cục bộ.

  • Biến Boolean : Điều này có thể làm cho mã của bạn khó đọc hơn một chút, tùy thuộc vào số lượng lớp vòng lặp lồng nhau mà bạn có:

    Dim done = False
    
    For Each item In itemList
        For Each item1 In itemList1
            If item1.Text = "bla bla bla" Then
                done = True
                Exit For
            End If
        Next
        If done Then Exit For
    Next
    

3
Không thể nói rằng bất kỳ cái nào trong số đó tốt hơn cái gotokhác ngoài chức năng nếu nó thực sự có ý nghĩa.
Chris Marisic

2
Tôi sẽ sử dụng nó gototrong một dự án lớn chỉ để nhớ lại những ngày lập trình của tôi trong qbasic, à những khoảng thời gian ngây thơ như vậy. nếu không, tôi sẽ đi làm một hình nộm.
Sharky

1
Tôi thích cách tiếp cận Try/ Exit Tryhơn, nhưng tôi không thích gototùy chọn này.
JohnH

Lưu ý rằng phương pháp "biến Boolean" yêu cầu nhiều biến và thử nghiệm khi mức lồng vào sâu hơn. Điều này trở nên
điên rồ

1
@ysap - Theo kinh nghiệm của tôi, hiếm khi cần nhiều biến boolean. Thông thường, có một điều kiện thoát duy nhất (ví dụ: "xong") mà một khi nó gặp phải, tất cả các mức vòng lặp sẽ được thoát. Tuy nhiên, tôi thích tạo một phương pháp riêng biệt và sử dụng "Return" - điều này đóng gói rõ ràng cấu trúc lồng nhau.
Thợ làm công cụ Đến

16

Đặt các vòng lặp trong một chương trình con và gọi return


1
Cần lưu ý rằng có chi phí liên quan đến một cuộc gọi như vậy không có trong gotogiải pháp đơn giản hơn . Tất nhiên, nếu mã có thể sử dụng lại được thì dù sao nó cũng phải ở trong một hàm.
Dan Bechard

Làm thế nào nó có thể là một chi phí? @ Dan
Altiano Gerung

@AltianoGerung Chà, nhận xét của tôi ở trên giả định rằng trình biên dịch không tối ưu hóa và nội dòng lệnh gọi hàm. Tất cả các lệnh gọi hàm (giả sử chúng không được trình biên dịch nội tuyến) có phần mở đầu và phần kết để cập nhật con trỏ ngăn xếp cơ sở (cũng như thực hiện những việc khác như hủy lệnh gọi và thu gom rác nếu ngôn ngữ hỗ trợ nó). Điều này thường là vụn vặt trong sơ đồ tổng thể của mọi thứ, nhưng lại tồn tại và có thể nhanh chóng trở nên rõ ràng trong những vòng lặp chặt chẽ. en.wikipedia.org/wiki/Function_prologue
Dan Bechard

@Dan Chà, điều đó ngoài tôi LOL. Tôi nghĩ với các trường hợp sử dụng của mình và cách công nghệ cải tiến theo thời gian, tôi sẽ không bao giờ cần phải lo lắng về điều đó.
Altiano Gerung

2
@AltianoGerung Nếu có bất cứ điều gì kinh nghiệm đã dạy tôi, đó là với quy mô đủ lớn, ngay cả những vấn đề nhỏ nhất cũng trở nên đủ lớn để trở thành vấn đề. Như mọi khi, hãy lập hồ sơ trước khi bạn đưa ra bất kỳ giả định nào. :)
Dan Bechard

3

Tạo vòng lặp bên ngoài thành vòng lặp while và "Thoát trong khi" trong câu lệnh if.


Điều này thực hiện tương tự như khi gotocó nhiều hướng dẫn hơn, chi tiết hơn và thụt lề nhiều hơn. Vấn đề ở đây là gì?
Dan Bechard

3

Tôi đã thử nghiệm gõ "exit for" một vài lần và nhận thấy nó hoạt động và VB không la mắng tôi. Đó là một lựa chọn tôi đoán nhưng nó trông rất tệ.

Tôi nghĩ lựa chọn tốt nhất tương tự như lựa chọn được chia sẻ bởi Tobias. Chỉ cần đặt mã của bạn vào một hàm và để nó trở lại khi bạn muốn thoát ra khỏi vòng lặp của mình. Trông cũng sạch sẽ hơn.

For Each item In itemlist
    For Each item1 In itemlist1
        If item1 = item Then
            Return item1
        End If
    Next
Next

Không, nhiều "Exit For" không dẫn đến hành vi mong muốn. Cái đầu tiên thoát khỏi vòng lặp đầu tiên , những cái bổ sung không bao giờ đạt được, vì vậy không có tác dụng. Khác với gợi ý đó, bạn dường như chỉ lặp lại các câu trả lời trước đó.
Thợ làm công cụ Đến

3
For i As Integer = 0 To 100
    bool = False
    For j As Integer = 0 To 100
        If check condition Then
            'if condition match
            bool = True
            Exit For 'Continue For
        End If
    Next
    If bool = True Then Continue For
Next

Không sử dụng cái này. Hành vi của nó là sai. Thay vào đó, hãy xem giải pháp "biến boolean" của câu trả lời được chấp nhận từ sáu năm trước. Nếu đó là một cách tiếp cận mới, tôi sẽ giải thích điều gì khiến nó hoạt động không chính xác, nhưng nó không đáng làm như vậy, vì cách tiếp cận đã được thể hiện chính xác trong câu trả lời trước đó.
ToolmakerSteve

0

Nếu tôi muốn thoát khỏi vòng lặp for-to, tôi chỉ cần đặt chỉ mục vượt quá giới hạn:

    For i = 1 To max
        some code
        if this(i) = 25 Then i = max + 1
        some more code...
    Next`

Cha.


Tôi khuyên bạn nên chỉ ra cách điều này áp dụng cho câu hỏi này. Lấy mã từ câu hỏi và chỉnh sửa nó để sử dụng phương pháp này.
Thợ làm công cụ Đến
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.