【问题标题】:Using a switch based on an enum C#使用基于枚举 C# 的开关
【发布时间】:2017-02-08 10:16:08
【问题描述】:

我得做一些关于创建农场的功课。 我必须在几个小时和几天内描述每个事件(从早上 6 点到下午 22 点,从周一到周六)。 我正在尝试使用基于这样的枚举的开关:

// 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 循环,例如:

While(Journee!=Nuit)

switch(Journee)

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

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

以此类推,直到深夜。

有没有更简单的方法可以在没有枚举和开关的情况下执行此循环?

谢谢。

【问题讨论】:

  • 除此之外,该枚举不是很好地使用标志。例如,2 | 4 与 6 相同,您知道吗?你为什么要为此使用枚举?为什么不只使用一个条件?
  • 听起来你想要一个嵌套循环,外循环的天数为 6,内循环的小时数为 16。
  • 是的,我想我把整个事情复杂化了!感谢您的回复

标签: c# enums switch-statement


【解决方案1】:

您可以简单地创建一个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

【讨论】:

  • 听起来很有趣!谢谢 HimbromBeere
  • 好的,我午饭后试试。谢谢你
【解决方案2】:

您可以通过两个简单的循环逐步了解农民工作周中的每一天和每一小时:

// 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);

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多