VB.NET - จะย้ายไปยังรายการถัดไป a สำหรับแต่ละลูปได้อย่างไร?


94

มีสเตตัสExit Forไหมยกเว้นแทนที่จะออกจากลูปมันก็ย้ายไปรายการถัดไป

ตัวอย่างเช่น:

For Each I As Item In Items

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

    ' Do something

Next

ฉันรู้ว่าสามารถเพิ่มElseคำสั่ง If ได้ดังนั้นมันจะอ่านดังนี้:

For Each I As Item In Items

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

Next

แค่สงสัยว่ามีวิธีข้ามไปยังรายการถัดไปในItemsรายการ ฉันแน่ใจว่าส่วนใหญ่จะถามอย่างถูกต้องว่าทำไมไม่ใช้แค่Elseคำสั่ง แต่สำหรับฉันแล้วการตัดโค้ด "Do Something" ดูเหมือนจะอ่านได้น้อยลง โดยเฉพาะอย่างยิ่งเมื่อมีรหัสมากขึ้น

คำตอบ:


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

    ' Do something
Next

ขอบคุณนี่คือสิ่งที่ฉันกำลังมองหาตลกดีที่มันไม่ได้อยู่ในเอกสาร MSDN ?? ( msdn.microsoft.com/en-us/library/5ebk1751.aspx ) ขอแสดงความยินดีด้วยที่เอาชนะจอนโพสต์ได้ตลอด 20 วินาที! :)
Sean Taylor

9
ฉันเกือบจะโดน Skeeted อีกครั้ง! ;)
Adam Robinson

คุณควรปิดIfคำสั่งอย่างถูกต้อง มันทำให้เข้าใจผิด
mchar

48

ฉันจะใช้Continueคำสั่งแทน:

For Each I As Item In Items

    If I = x Then
        Continue For
    End If

    ' Do something

Next

โปรดทราบว่าสิ่งนี้จะแตกต่างกันเล็กน้อยกับการย้ายตัววนซ้ำเอง - ทุกอย่างก่อนที่Ifจะดำเนินการอีกครั้ง โดยปกตินี่คือสิ่งที่คุณต้องการ แต่ถ้าไม่ใช่คุณจะต้องใช้GetEnumerator()แล้วMoveNext()/ Currentอย่างชัดเจนแทนที่จะใช้For Eachลูป



1

ฉันต้องการให้ชัดเจนว่ารหัสต่อไปนี้ไม่ใช่แนวปฏิบัติที่ดี คุณสามารถใช้ 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

24
คุณทำได้ แต่อย่าทำ
MiseryIndex

เนื่องจากการกระโดดจึงเป็นผลเสีย
Syed Tayyab Ali

4
หากไม่ใช่แนวทางปฏิบัติที่ดีและมีวิธีแก้ปัญหาที่ดีกว่าอย่างชัดเจนที่ภาษารองรับ (Continue For / Resume Next) คำตอบนี้อาจถูกลบออกโดยสมัครใจ
eniacAvenger

Stackoverflow ให้คำตอบหลายคำตอบเพื่อจุดประสงค์ในการสำรวจช่วงของตัวเลือกที่มีให้ ฉันยอมรับว่านี่เป็นตัวเลือกที่ไม่ดี แต่เป็นตัวเลือก ดังนั้นฉันคิดว่ามันควรค่าแก่การรวมไว้เพื่อความสมบูรณ์
Jeff

0

เมื่อฉันพยายามContinue Forล้มเหลวฉันได้รับข้อผิดพลาดของคอมไพเลอร์ ในขณะที่ทำสิ่งนี้ฉันได้ค้นพบ 'Resume':

For Each I As Item In Items

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

    'Do something

Next

หมายเหตุ: ฉันใช้ VBA ที่นี่


2
รหัสนี้ใช้ไม่ได้ใน VBA Resume Nextมีไว้สำหรับการจัดการข้อผิดพลาดที่ไม่มีโครงสร้าง
Daniel

คุณต้องใช้คำสั่ง IF ขนาดใหญ่เพื่อตัดส่วนท้ายทั้งหมดของลูปใน VBA เนื่องจากไม่มีคำสั่งต่อ ดังนั้นIf I <> x Then
HackSlash

0

เฉพาะ "ดำเนินการต่อสำหรับ" เท่านั้นที่เป็นมาตรฐานที่ยอมรับได้ (ส่วนที่เหลือนำไปสู่ ​​"รหัสสปาเก็ตตี้")

อย่างน้อยด้วย "ดำเนินการต่อสำหรับ" โปรแกรมเมอร์ที่รู้ว่ารหัสจะไปที่ด้านบนสุดของลูปโดยตรง

สำหรับคนเจ้าระเบียบสิ่งนี้ดีที่สุดเนื่องจากเป็นรหัส "ไม่ใช่สปาเก็ตตี้" ล้วนๆ

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

เพื่อความสะดวกในการเข้ารหัส "ดำเนินการต่อสำหรับ" ก็ใช้ได้ (เป็นความคิดที่ดีที่จะแสดงความคิดเห็น)

การใช้ "ดำเนินการต่อสำหรับ"

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.