简体   繁体   中英

Using a switch based on an enum C#

I gotta do some homework about creating a farm. And i have to describe each events within the hours and the days (from 6 AM to 22 PM, from Monday to Saturday ). I'm trying to use a switch based on a enum like this :

// 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,

    }

In my program.cs, i would like to do a while loop such as :

While(Journee!=Nuit)

switch(Journee)

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

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

and so on until it will reach the night.

Is there an easier way to do this loop without an enum and a switch ?

Thank you.

You can simply create a Dictionary<int, Action> that holds your hours as keys and the action to execute in the value:

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

Than simply execute the delegate by providing the current hour:

dict[6]();

So you won´t even care on if it is day or night, just pass the current time and you´re gone.

When you also want to consider the weekdays you´ll need a nested dictionary:

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

Call it like this:

weekMap["Monday"][6]()

to execute farmer.DoAction .

You can step through each day and hour of the farmers working week with two simple loops:

// 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                
    }
}

For example he must eat his dinner every day so you can have a case like this:

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

He might only plow the fields on a Wednesday at 10AM and not any other day:

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

You may want to put the switches into a method like so:

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

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

Then the inside of your inner loop just becomes:

DoWork(farmer, day, hour);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM