2015-06-18 6 views
0

У меня есть вложенный оператор if/else в цикле for, чтобы определить, действительно ли значение имеет значение массива. Он возвращает все значения только штрафа, однако, если IF правилен, он все еще делает else еще три раза. Я подумал, что когда-то это будет равным один раз, это остановится, но я полагаю, что здесь что-то не хватает.C# вложенное if/else в цикле for

Любые мысли?

string sectionChoice; 
int ticketQuantity; 
double ticketPrice, totalCost; 
string[] section = { "orchestra", "mezzanine", "balcony", "general" }; 
double[] price = { 125.25, 62.00, 35.75, 55.50 }; 
bool isValidSection = false; 

sectionChoice = GetSection(); 
ticketQuantity = GetQuantity(); 

for (int x = 0; x < section.Length; ++x) 
{ 
     if (sectionChoice == section[x]) 
     { 
      isValidSection = true; 
      ticketPrice = price[x]; 

      totalCost = CalcTicketCost(ticketPrice, ticketQuantity); 
      Console.Write("\n\nTotal cost for the tickets are: {0:c2}", totalCost); 
     } 
     else 
      Console.Write("\n\nInvalid entry, {0} does not exsist", sectionChoice);   
} 

Когда действительно, она возвращает что-то вроде этого:

Ваша цена является 32,50. Неверная запись, й не exsist Invalid записи, й не exsist Invalid записи, й не exsist

+1

Вы должны использовать десятичные значения для значений валюты ([подробнее] (http://stackoverflow.com/q/693372/188246)). –

ответ

1

Ключевое слово вы ищете break;

break остановит выполнение цикла он находится внутри , Если вы находитесь внутри вложенных циклов, это будет работать только на самом внутреннем.

Противоположностью является continue. Continue останавливает эту итерацию и переходит на следующую.

Here is an MSDN article explaining it more in depth

for (int x = 0; x < section.Length; ++x) 
{ 
    if (sectionChoice == section[x]) 
    { 
     isValidSection = true; 
     ticketPrice = price[x]; 

     totalCost = CalcTicketCost(ticketPrice, ticketQuantity); 
     Console.Write("\n\nTotal cost for the tickets are: {0:c2}", totalCost); 
     break; 
    } 
    else 
    Console.Write("\n\nInvalid entry, {0} does not exsist", sectionChoice); 
} 
+1

Doh! Благодарим вас: – Podo

+0

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

+1

Абсолютно. В нем говорится, что я должен подождать несколько минут, но я, безусловно, буду. – Podo

0

Если вы хотите, чтобы остановить итерации, когда условие if выполнено, вам нужно выйти из цикла с break высказыванием:

for (int x = 0; x < section.Length; ++x) 
{ 

    if (sectionChoice == section[x]) 
    { 
     isValidSection = true; 
     ticketPrice = price[x]; 

     totalCost = CalcTicketCost(ticketPrice, ticketQuantity); 
     Console.Write("\n\nTotal cost for the tickets are: {0:c2}", totalCost); 
     break; // THIS IS THE IMPORTANT CHANGE 
    } 

} 
if (!isValidSection) // TEST MOVED OUTSIDE OF LOOP 
{ 
    Console.Write("\n\nInvalid entry, {0} does not exsist", sectionChoice); 
} 
+0

Вы все равно можете получить недопустимое сообщение ввода несколько раз, если выбранный раздел не первый! –

+0

Спасибо за подсказку; Я обновил свой ответ. – adv12

4

Что вы на самом деле пытаясь сделать, это определить, содержит ли section определенное значение и что-то делать, если это произойдет. Просто проверьте , что непосредственно:

if (section.Contains(sectionChoice)) 

Вы также не должны использовать parallel arrays. Вместо того, чтобы иметь два массива, разделы цен, в которых объект в индексе каждого из них «объединяется» с равным значению, кажется, что то, что вы на самом деле моделируете, является средством поиска стоимости конкретного раздела. Это лучше всего моделируется с помощью Dictionary, который может легко найти значение для определенного ключа. Здесь ваш ключ - это раздел, а стоимость - его цена.

Dictionary<string, decimal> ticketsPrices = new Dictionary<string, decimal>() 
{ 
    {"orchestra", 125.25m}, 
    //... 
}; 
bool isValidSection = false; 

string sectionChoice = GetSection(); 
int ticketQuantity = GetQuantity(); 

if (ticketsPrices.ContainsKey(sectionChoice)) 
{ 
    isValidSection = true; 
    decimal ticketPrice = ticketsPrices[sectionChoice]; 

    decimal totalCost = CalcTicketCost(ticketPrice, ticketQuantity); 
    Console.Write("\n\nTotal cost for the tickets are: {0:c2}", totalCost); 
} 
else 
    Console.Write("\n\nInvalid entry, {0} does not exsist", sectionChoice); 
+0

Этот ответ превосходит остальных, определяя намерение и решая проблему лучше. – adv12

+0

Что происходит с 'x'? Вам все еще нужен индекс, чтобы получить цену, но это правильная идея (или словарь может быть использован с словарем <строка, десятичная>) –

+0

@DavidSherret, хорошая точка. Не видел этого изначально. Может быть решена с помощью 'Array.IndexOf' и будет по-прежнему чище, чем другие ответы. – adv12

0

Не хотите сообщить о том, что это неверный выбор для каждой из них, что не соответствует:

for (int x = 0; x < section.Length; ++x) 
{ 
    if (sectionChoice == section[x]) 
    { 
     isValidSection = true; 
     ticketPrice = price[x]; 

     totalCost = CalcTicketCost(ticketPrice, ticketQuantity); 
     Console.Write("\n\nTotal cost for the tickets are: {0:c2}", totalCost); 
     break; 
    } 
} 

if (!isValidSection) 
    Console.Write("\n\nInvalid entry, {0} does not exist", sectionChoice); 
+0

Могу ли я просить причину для голосов? Это только мой третий пост. Я не уверен, где этого не хватает. – Mike

+0

Фактически, недопустимое сообщение ввода должно быть помещено ** после ** цикла, иначе оно все равно может быть записано на консоль несколько раз! –

1

Получить индекс выбранного элемента, как это:

int i = section.IndexOf(sectionChoice); 
if (i >= 0) { 
    ticketPrice = price[i]; 
} else { 
    // Not found! 
} 

Однако ваш код станет более гибким с классом элемента

public class Section 
{ 
    public string Name { get; set; } 
    public decimal Price { get; set; } 
} 

С помощью этого класса можно создать список разделов, как этот

List<Item> sections = new List<item> { 
    new Section { Name = "orchestra", Price = 125.25 }, 
    new Section { Name = "mezzanine", Price = 62.00 }, 
    ... 
}; 

Теперь вы можете найти раздел, как это:

Section section = sections.FirstOrDefault(s => s.Name == sectionChoice); 
if (section != null) ... 

Как это проще добавлять новые свойства к разделам , Например. вы можете добавить к нему несколько оставшихся мест, не создавая новый массив.

Смежные вопросы