2013-05-03 2 views
-1

У меня есть этот код:вложенная Еогеасп петли с выключателем оператор не увеличивающимся случаем переменной

   foreach(List<string> build in Builds) 
       { 
        int i = 0; 
        foreach(string item in build) 
        { 
         switch (i) 
         { 
          case 0: 
           Console.WriteLine("BuildID: " + item); 
           break; 
          case 1: 
           Console.WriteLine("UserID: " + item); 
           break; 
          case 2: 
           Console.WriteLine("Parameter 1: " + item); 
           break; 
          case 3: 
           Console.WriteLine("Parameter 2: " + item); 
           break; 
          case 4: 
           Console.WriteLine("Parameter 3: " + item); 
           break; 
          case 5: 
           Console.WriteLine("Parameter 4: " + item); 
           break; 
         } 
         i++; 
         Console.WriteLine(i); 
        } 
       } 

и вывод:

BuildID: 1 
1 
BuildID: 1 
1 
BuildID: a 
1 
BuildID: b 
1 
BuildID: c 
1 
BuildID: d 
1 

Элементов в списке приращение и отображаются правильно (1 , 1, a, b, c, d), но по какой-то причине я не знаю, что приращение счетчика i будет забыто после выполнения коммутатора? Я не понимаю? Ожидаемый результат должен быть:

BuildID: 1 
1 
UserID: 1 
2 
Parameter 1: a 
3 
Parameter 2: b 
4 
Parameter 3: c 
5 
Parameter 4: d 
6 
+1

Проверьте свои данные. Это соответствует списку списков отдельных элементов. –

+0

В ваших сборках есть несколько предметов? –

+0

Простите, я не понимаю, что вы имеете в виду? Фактические данные в списке выполняются должным образом, но простая переменная инкремента «i» забывается, не имеет ничего общего с данными в списке – Dan

ответ

4

Я сильно подозреваю, что у вас есть множественный списки, но каждый список имеет только одну запись.

Внутри внешнего цикла вы объявляете i и инициализируете его 0 ... так что поведение, которое вы показали, именно то, что вы получили в этой ситуации.

Это легко диагностировать дальше. Просто добавьте еще немного протоколирования:

foreach(List<string> build in Builds) 
{ 
    Console.WriteLine("New build with {0} items", build.Count); 
    int i = 0; 

я подозреваю, вы увидите:

New build with 1 items 
BuildID: 1 
1 
New build with 1 items 
BuildID: 1 
1 
New build with 1 items 
BuildID: a 
1 
New build with 1 items 
BuildID: b 
1 
New build with 1 items 
BuildID: c 
1 
New build with 1 items 
BuildID: d 
1 

Если предположить, что это то, что вы на самом деле увидеть, но не то, что вы ожидаете увидеть, то вы должны вернуться назад и проследить, где Builds.

Как и в сторону, ваш код будет гораздо проще, так как:

private static readonly string[] BuildItemLabels = 
    { "BuildID", "UserID", "Parameter1", "Parameter2", "Parameter3" , "Parameter4" }; 
... 

foreach (List<string> build in Builds) 
{ 
    for (int i = 0; i < build.Count; i++) 
    { 
     Console.WriteLine("{0}: {1}", BuildItemLabels[i], build[i]); 
    } 
} 

(Вы должны рассмотреть, что произойдет, если список когда-либо был более чем 6 пунктов, заметьте ...)

+0

, что имеет смысл, я проверю, что на самом деле отправлено в «Builds» – Dan

2

Ну, ваш внутренний цикл работает не так, как ожидалось. Ваш вывод только делает BuildId, что означает foreach(string item in build). Единственный элемент в каждой сборке - BuildId, ваш коммутатор печатает это, затем вы получаете снизу, увеличиваете i, печатаете его и возвращаетесь во внешний цикл, где оно установлено на 0. Вот почему это всегда 1. Проблема лежит за пределами петель. Списки сборки на самом деле не заполняются данными, которые вы ожидаете от них.

+0

, что имеет смысл, я проверю, что на самом деле отправляется в «Builds» – Dan

+0

@ если вы пройдете через это, я уверен, вы обнаружите, что вы проходите только внутренний цикл один раз для каждой итерации внешнего цикла, который, очевидно, не является предполагаемым поведением. Как только вы подтвердите, что посмотрите, где вы заполняете список, вот в чем проблема. – evanmcdonnal

0

В целом это не должно быть проблемой.

Этот код:

 var list1 = new List<int> {10, 20, 30}; 
     var list2 = new List<int> {1, 2, 3}; 

     int i = 0; 

     foreach (int integ in list1) 
     { 
      foreach (int integ2 in list2) 
      { 
       switch (i) 
       { 
        case 0: 
         Console.WriteLine(integ + integ2); 
         break; 
        case 1: 
         Console.WriteLine(integ + integ2); 
         break; 
        default: 
         Console.WriteLine(integ + integ2); 
         break; 
       } 
      } 
      i++; 
      Console.WriteLine(i); 
     } 

Результаты:

11 
12 
13 
1 
21 
22 
23 
2 
31 
32 
33 
3 
Смежные вопросы