VB.NET - Làm thế nào để chuyển đến mục tiếp theo a Cho Mỗi vòng lặp?


93

Có một trạng thái như thế nào không Exit For, ngoại trừ thay vì thoát khỏi vòng lặp, nó chỉ chuyển sang mục tiếp theo.

Ví dụ:

For Each I As Item In Items

    If I = x Then 
        ' Move to next item
    End If

    ' Do something

Next

Tôi biết có thể chỉ cần thêm một Elsevào câu lệnh If để nó sẽ đọc như sau:

For Each I As Item In Items

    If I = x Then 
        ' Move to next item
    Else
        ' Do something
    End If

Next

Chỉ cần tự hỏi nếu có cách nào để chuyển đến mục tiếp theo trong Itemsdanh sách. Tôi chắc rằng hầu hết sẽ hỏi tại sao không chỉ sử dụng Elsecâu lệnh, nhưng đối với tôi, đoạn mã "Do Something" dường như khó đọc hơn. Đặc biệt là khi có rất nhiều mã.

Câu trả lời:


178
For Each I As Item In Items
    If I = x Then Continue For

    ' Do something
Next

Cảm ơn đây chính xác là những gì tôi đang tìm kiếm, buồn cười làm sao nó không có trong tài liệu MSDN ?? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) Cũng chúc mừng bạn đã đánh bại Jon về vị trí đăng bài, trong 20 giây! :)
Sean Taylor

9
Tôi suýt bị xóa một lần nữa! ;)
Adam Robinson

Tốt hơn bạn nên đóng Ifbáo cáo đúng cách. Nó gây hiểu lầm.
mchar

48

ContinueThay vào đó tôi sẽ sử dụng câu lệnh:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

Lưu ý rằng điều này hơi khác so với việc di chuyển chính trình lặp - bất kỳ thứ gì trước khi hành động Ifsẽ được thực thi lại. Thông thường đây là những gì bạn muốn, nhưng nếu không, bạn sẽ phải sử dụng GetEnumerator()và sau đó MoveNext()/ Currentrõ ràng thay vì sử dụng For Eachvòng lặp.


4

Thế còn:

If Not I = x Then

  ' Do something '

End If

' Move to next item '

1

Tôi muốn nói rõ rằng đoạn mã sau không phải là cách thực hành tốt. Bạn có thể sử dụng GOTO Label:

For Each I As Item In Items

    If I = x Then
       'Move to next item
        GOTO Label1
    End If

    ' Do something
    Label1:
Next

23
Bạn có thể, nhưng xin đừng.
MiseryIndex

Do nhảy, do đó nó là xấu.
Syed Tayyab Ali

4
Nếu đó không phải là phương pháp hay và có một giải pháp rõ ràng tốt hơn mà ngôn ngữ đó hỗ trợ (Tiếp tục Cho / Tiếp tục Tiếp theo), có thể câu trả lời này nên được tự nguyện xóa.
eniacAvenger

Stackoverflow cho phép nhiều câu trả lời nhằm mục đích khám phá phạm vi các tùy chọn có sẵn. Tôi đồng ý đây là một lựa chọn tồi, nhưng đó là một lựa chọn. Vì vậy, tôi nghĩ rằng nó xứng đáng được đưa vào để hoàn thiện.
Jeff

0

Khi tôi thử Continue Forkhông thành công, tôi gặp lỗi trình biên dịch. Trong khi làm điều này, tôi đã phát hiện ra 'Tiếp tục':

For Each I As Item In Items

    If I = x Then
       'Move to next item
       Resume Next
    End If

    'Do something

Next

Lưu ý: Tôi đang sử dụng VBA ở đây.


2
Mã này thậm chí không hoạt động trong VBA. Resume Nextlà để xử lý lỗi không có cấu trúc.
Daniel

Bạn phải sử dụng một câu lệnh IF lớn để bao bọc toàn bộ phần cuối của vòng lặp trong VBA vì không có câu lệnh tiếp tục. Vì vậyIf I <> x Then
HackSlash

0

Chỉ có "Continue For" là tiêu chuẩn được chấp nhận (phần còn lại dẫn đến "mã spaghetti").

Ít nhất với "tiếp tục cho" lập trình viên biết mã đi thẳng đến đầu vòng lặp.

Tuy nhiên, đối với những người theo chủ nghĩa thuần túy, một cái gì đó như thế này là tốt nhất vì nó là mã "không phải mì chính" thuần túy.

Dim bKeepGoing as Boolean 
For Each I As Item In Items
  bKeepGoing = True
  If I = x Then
    bKeepGoing = False
  End If
  if bKeepGoing then
    ' Do something
  endif
Next

Tuy nhiên, để dễ viết mã, "Tiếp tục Cho" là OK. (Ý kiến ​​hay để nhận xét nó mặc dù).

Sử dụng "Tiếp tục cho"

For Each I As Item In Items
  If I = x Then
    Continue For   'skip back directly to top of loop
  End If
  ' Do something
Next
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.