2017-02-08 12 views
1

Мне нужно сделать домашнее задание о создании фермы. И я должен описывать каждое событие в течение часов и дней (от 6 A.M до 22 P.M, с понедельника по субботу). Я пытаюсь использовать переключатель на основе перечисления, как это:Использование переключателя на основе перечисления C#

// this is the hour's enum (day and night). 

[Flags] 
    enum Horaire 
    { 
     Journee = 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 18 | 19 | 20 | 21,  
     Nuit = 22 | 23 | 0 | 1 | 2 | 3 | 4 | 5, 

    } 

В моем Program.cs, я хотел бы сделать то время цикла, такими как:

While(Journee!=Nuit) 

switch(Journee) 

case 6: // for 6.am 
Farmer.DoAction(); 

case 12 : // for 12.pm 
Farmer.Eat(); 

и так далее пока он не достигнет ночи.

Есть ли более простой способ сделать этот цикл без перечисления и переключателя?

спасибо.

+4

Помимо всего прочего, что перечисление * не * хороший использование флагов. Вы понимаете, что '2 | 4' то же, что и 6, например? Почему вы хотите использовать перечисление для этого вообще? Почему бы просто не использовать одно условие? –

+0

Похоже, вы хотите вложенный цикл, внешний цикл со счетом 6 для дней и внутренний цикл 16 часов. – Equalsk

+0

Да, я думаю, я все это усложнил! Спасибо за ваши ответы – Karro

ответ

2

Вы можете просто создать Dictionary<int, Action>, который держит ваши часы в качестве ключей и действия для выполнения в значении:

var dayMap = new Dictionary<int, Action> 
{ 
    { 6, farmer.DoAction }, 
    { 12, farmer.Eat }, 
    { 22, farmer.Sleep } 
}; 

чем просто выполнить делегат, предоставляя текущий час:

dict[6](); 

Таким образом, вам даже не нужно заботиться о том, будет ли это днем ​​или ночью, просто передайте текущее время, и вы ушли.

Когда вы хотите рассмотреть будням нуждаются в Там вы можете гнездовой словарь:

var weekMap = new Dictionary<string, Dictionary<int, Action>> 
{ 
    { "Monday", new Dictionary<int, Action> { ... }} 
}; 

Зов это следующим образом:

weekMap["Monday"][6]() 

выполнить farmer.DoAction.

+0

, что звучит интересно! Спасибо HimbromBeere – Karro

+0

Хорошо, я попробую его после обеда. спасибо вам – Karro

0

Вы можете пройти через каждый день и час фермеров рабочей недели с двумя простыми петлями:

// Outer loop counts the day, 1 being Monday and 6 being Saturday 
for (int day = 1; day <= 6; day++) 
{ 
    // The Inner loop counts working hours from 6AM to 22PM. 
    for (int hour = 6; hour <= 22; hour++) 
    { 
     // Now you can inspect 'day' and 'hour' to see where you are and take action     
    } 
} 

Например, он должен съесть свой обед каждый день, так что вы можете иметь дело так:

if (hour == 12) 
{ 
    Farmer.Eat(); 
} 

Он мог только пахать поля на среду в 10 утра, а не в любой другой день:

if (day == 3 && hour == 10) 
{ 
    Farmer.PlowFields(); 
} 

Вы можете поставить переключатели в метод следующим образом:

public void DoWork(Farmer farmer, int day, int hour) 
{ 
    if (hour == 6) 
     farmer.WakeUp(); 

    if (day == 3 && hour == 10) 
     farmer.PlowFields(); 
} 

Тогда внутри вашего внутреннего цикла становится просто:

DoWork(farmer, day, hour);