2010-12-06 3 views
0
loop one 
{ 
    looptwo 
    { 
     if(condition=true) 
     { 
      reset values//restart both loops 
     } 
    } 
} 
and possibilities for reset values is 3 

basically i want to compair two matrices 

a= 1 2 3 4 

    1 2 3 4 
b= 3 4 5 6 
    4 6 7 8 

and when row 1 of a[] is matched with row 1 of b[].....i will add these rows and a[] 
become = 2 4 6 8 

for(i=0;i<rows;i++) 
for(j=0;j<columns;j++) 
{ 
a[i]=a[i]+b[i,j] 
} 

다시 재시작에서 내 maches을 찾아 새 A [] 매트릭스재설정하거나 다시 시작하는 방법 중첩 루프

와 나는 보험에 가입해야하는 [] 매트릭스는 []있는 체크 (B)의 모든 행 이 경우 3입니다.

+0

당신에 대해 조금 더 명확 할 수 있습니다 제안 당신은 또한 방법의 접근 방식을 사용할 수 있습니까? – Doggett

+0

당신은 틀림없이'if (condition == true)'를 의미했습니다, 맞습니까? – Vlad

+0

"재설정 값"과 "재설정 값에 대한 가능성은 3"으로 무엇을 의미하는지 명확히 설명합니까? – Doggett

답변

1

여기서 가장 좋은 방법은 루프를 자체 메서드로 이동하고 내부 루프 내부에서 돌아가는 것입니다. 예 :이 어떤 이유로 할 수없는 경우

public void MyMehod(){ 
    loop one{ 
    looptwo{ 
     if(condition=true){ 
     return; 
     } 
    } 
    } 
} 

, 당신은 그들 모두의 구제 내부 루프에 설정된 부울 값을 사용할 수 있지만이 더 지저분 조금 :

bool endloop = false; 
while(!endloop){ 
    while(!endloop){ 
    if(condition){ 
     endloop = true; 
    } 
    } 
} 

while 루프는 괜찮아 보이지만, for 루프 또는 foreach 루프의 경우 훨씬 더 어둡습니다.

+1

그 루프를 다시 시작하지 않습니다, 그것을 취소합니다. –

+1

나는 그것이 그가'reset'이라고 말했을 때의 의미라고 생각했지만,'restart' 부분을 다루지 않는다는 것에 동의합니다. 하지만 리셋/취소에 대해서는 이것이 최선의 방법이라고 생각합니다. –

+0

구제를위한 특별한 bool 값을 갖는 것은 효율성이 떨어지며 직설적 인 'goto'보다 훨씬 표현력이 떨어집니다. – Vlad

2

goto을 사용하면 C#에서 여러 루프 수준을 벗어날 수 있습니다. 예를 들어 :

RESTART: 
    while (a) { 
     while (b) { 
      if (that_other_thing) 
       goto RESTART; 
     } 
    } 

글쎄, 당신은하지 않습니다 goto를 사용하는을 가지고 있지만 대안이 다시 시작해야하는 것을 나타내는 플래그 변수의 무리를 사용할 수 있습니다. 그리고 그 코드는 아마도 따라 오기가 꽤 어려울 것입니다.

+0

이 작업은 정상적으로 작동 할 것입니다. 그러나이 작업이 꽤 해가없는 경우에도 실제로 작업중인 'goto'키 작업을 볼 때 * 흔들림 *을 얻을 수 없습니다. –

+0

@ Øyvind : 'goto'는 적절한 용도로 사용되지만 더 읽기 쉬운 구문을 사용할 수있는 경우 사용해서는 안되는 본질적으로 사악한 도구라고 생각하기 때문입니다. :) – cdhowie

+0

그게 딱 맞는 것 같습니다.) 심지어 작은 빨간 뿔이 여전히 그 위에 있다는 것을 알았 더라면 좋겠지 만) –

0
  Start: 
      for (int i = 0; i < 10; i++) 
      { 
       for (int j = 0; j < 10; j++) 
       { 
        if(j == 5) 
         goto Start; 
       } 
      } 

goto을 사용하지 않도록하는 방식으로 코드를 구조화하는 것이 훨씬 더 나은 방법이지만 ...

+0

'goto'를 피하고 그 코드를 추악하게하거나 어렵게 만들지 않기 위해이 사건에 대해 당신은 무엇을 제안하겠습니까? – Vlad

+0

@Vlad 루프에서 빠져 나올 수있는 일종의 메서드로 '작업'을 추출하고 필요한만큼 여러 번 호출하여 메서드 또는 외부 매개 변수를 통해 필요한 데이터를 반환합니다. 컨텍스트는 핵심입니다. 문제 세트에 대해 더 많이 알면 도움이 될 것입니다. –

+0

은 잠재적으로 매우 작은 코드 (옵티 마이저가 인라인 할 수 있음)를위한 별도의 메소드를 정의해야하므로 잔인하며 imho는 코드를 이해하기 어렵게 만듭니다 (유지 관리도). – Vlad

0

당신은 당신이하지 않는 것을 당신에게 말할 것이다 조건을있을 것이라는 점을 보장 할 수있는 경우 재시작이 필요하다면 모든 것을 하나의 루프로 감쌀 수 있습니다. 이 같은 숫자 루프 변수를 사용하는 경우

List<string> a = GetNamesFromeSomewhere(); 

bool duplicateFound = true; 
while (duplicateFound) 
{ 
    duplicateFound = false; 
    for (int x = 0; x < a.Length; x++) 
    { 
    for (int y = x + 1; y < a.Length; y++) 
    { 
     if (a[x].Equals(a[y])) 
     { 
     //Change a[y], but now we have to recheck for duplicates... 
     a[y] += "_"; 
     duplicateFound = true; 
     break; 
     } 
    } 
    if (duplicateFound) 
    { 
     break; 
    } 
    } 
} 
0

:

bool keepLooping = true; 
while (keepLooping) 
{ 
    keepLooping = false; 
    for (int x = 0; x < maxx; x++) 
    { 
    for (int y = 0; y < maxy; y++) 
    { 
     if (DoSomething(x, y)) 
     { 
     keepLooping = true; 
     break; 
     } 
    } 
    if (keepLooping) 
    { 
     break; 
    } 
    } 
} 

당신은 당신이이 같은 (가정 문자열 값을) 할 수있는 모든 항목이 고유해야합니까 중복에 대한 목록을 확인하고이를 수정하는 경우 i와 j 값만 재설정 할 수 있습니다.

예.

for (i=0; i<10; i++) { 
    for (j=0; j<10; j++) { 
     if (var[i][j] == 'x') { 
     i=0; j=0; break; 
     } 
    } 
} 

당신이 뭘하려는 건지 이전

void someFunction(params) { 
    for (i=0; i<10; i++) { 
     for (j=0; j<10; j++) { 
     if (var[i][j] == 'x') { 
      someFunction(params) 
      return; 
     } 
     } 
    }  
} 
+0

p.s. 무한 루프로 끝나지 않도록 조심해야합니다. – Mohamed

+0

실제로'j' 루프에서 벗어 났으므로'j '를 리셋 할 필요가 없으며'i'는'-1'로 설정해야합니다. 이것은 또한 매우 오류가 발생하기 쉽습니다. – Doggett

관련 문제