2008-12-11 31 views
21

nên được đơn giản và nhanh chóng: Tôi muốn có một C# tương đương với mã Java sau:C# tương đương với Java tiếp tục <label>?

orig: for(String a : foo) { 
    for (String b : bar) { 
    if (b.equals("buzz")) { 
     continue orig; 
    } 
    } 
    // other code comes here... 
} 

Sửa: OK có vẻ như không có tương đương như vậy (hey - Jon Skeet mình nói không có, mà giải quyết nó;)). Vì vậy, "giải pháp" cho tôi (trong tương đương Java của nó) là:

for(String a : foo) { 
    bool foundBuzz = false; 
    for (String b : bar) { 
    if (b.equals("buzz")) { 
     foundBuzz = true; 
     break; 
    } 
    } 
    if (foundBuzz) { 
    continue; 
    } 
    // other code comes here... 
} 

Trả lời

23

Tôi không tin rằng có một tương đương, tôi sợ. Bạn sẽ phải sử dụng một boolean, hoặc chỉ "goto" kết thúc bên trong của vòng lặp bên ngoài. Nó thậm chí còn lộn xộn hơn nó âm thanh, như một nhãn đã được áp dụng cho một tuyên bố - nhưng chúng tôi không muốn làm bất cứ điều gì ở đây. Tuy nhiên, tôi nghĩ rằng đây có phải những gì bạn muốn nó:

using System; 

public class Test 
{ 
    static void Main() 
    { 
     for (int i=0; i < 5; i++) 
     { 
      for (int j = 0; j < 5; j++) 
      { 
       Console.WriteLine("i={0} j={1}", i, j); 
       if (j == i + 2) 
       { 
        goto end_of_loop; 
       } 
      } 
      Console.WriteLine("After inner loop"); 
      end_of_loop: {} 
     } 
    } 
} 

tôi mạnh muốn giới thiệu một cách khác nhau thể hiện này, tuy nhiên. Tôi không thể nghĩ rằng có nhiều lần mà không có cách nào dễ đọc hơn để mã hóa nó.

+13

Đó là một chút ngạc nhiên khi C# có 'goto', nhưng không' phá vỡ/tiếp tục

+0

C# là đúng hơn với c rễ của nó hơn Java. Nó cũng có cấu trúc và con trỏ! –

2

Trong VB.Net, bạn chỉ có thể có một vòng lặp while và một vòng lặp for và sau đó là exit mức phạm vi mong muốn.

Trong C#, có thể break;?

Điều đó có thể thoát ra khỏi vòng lặp bên trong và cho phép vòng lặp bên ngoài tiếp tục.

0

Tôi nghĩ bạn đang tìm kiếm từ khóa "tiếp tục" đơn giản ... Tuy nhiên, không phải là một anh chàng Java tôi thực sự không hiểu đoạn mã đang cố gắng đạt được điều gì.

Hãy xem xét những điều sau đây.

foreach(int i in new int[] {1,2,3,5,6,7}) 
{ 
    if(i % 2 == 0) 
     continue; 
    else 
     Console.WriteLine(i.ToString());  
} 

Câu lệnh tiếp tục trên dòng 4 là hướng dẫn tiếp tục với vòng lặp ở giá trị tiếp theo. Sản lượng ở đây sẽ là 1,3,5 và 7.

Thay thế "tiếp tục" với "phá vỡ", như sau,

foreach(int i in new int[] {1,2,3,5,6,7}) 
{ 
    if(i % 2 == 0) 
     break; 
    else 
     Console.WriteLine(i.ToString());  
} 

sẽ cho sản lượng 1. Nghỉ giải lao chỉ thị các vòng lặp để chấm dứt, hầu hết thường được sử dụng khi bạn muốn ngừng xử lý khi một điều kiện được đáp ứng.

Tôi hy vọng điều này sẽ cung cấp cho bạn một số nội dung bạn đang tìm kiếm, nhưng nếu không, vui lòng hỏi lại.

+0

cảm ơn, nhưng tôi biết sự khác biệt giữa tiếp tục và nghỉ ngơi. ;-) điều là: tôi có hai vòng lồng nhau.và nếu một điều kiện nhất định trong vòng lặp bên trong xảy ra, tôi muốn "tiếp tục" vòng lặp bên ngoài. – Epaga

+1

Xin lỗi - did't có nghĩa là để dạy cho bạn để hút trứng - Lỗi của tôi là không đọc câu hỏi đầy đủ ... – ZombieSheep

0

Bạn có thể làm một cái gì đó như:

for(int i=0; i< foo.Length -1 ; i++) { 
    for (int j=0; j< bar.Length -1; j++) { 
    if (condition) { 
     break; 
    } 
    if(j != bar.Length -1) 
     continue; 
    /*The rest of the code that will not run if the previous loop doesn't go all the way*/ 
    } 
} 
+1

vấn đề ở đây là phần còn lại của mã là SAU vòng lặp lồng nhau, không phải trong nó. – Epaga

+0

Rất tiếc tôi chỉ chú ý trong ví dụ đầu tiên của tôi, tôi đã có dòng sai cho chú thích "// code here". lấy làm tiếc. – Epaga

+0

Bạn chỉ có thể đặt cờ trước khi vi phạm và kiểm tra cờ sau vòng lặp. Và nếu bạn thực sự muốn mã của bạn được chính thức 'cấu trúc' bạn đặt j = bar.Length thay vì sử dụng 'break'. –

8

posibility khác là để thực hiện một chức năng với các vòng trong:

void mainFunc(string[] foo, string[] bar) 
{ 
    foreach (string a in foo) 
    if (hasBuzz(bar)) 
     continue; 
    // other code comes here... 
} 

bool hasBuzz(string[] bar) 
{ 
    foreach (string b in bar) 
    if (b.equals("buzz")) 
     return true; 
    return false; 
} 
+0

Tôi thích điều này tốt hơn, bởi vì vòng lặp trong các chức năng thường có một ngữ nghĩa tốt (=> tên tốt) của riêng mình và do đó có thể tái sử dụng. – Spoc

Các vấn đề liên quan