【问题标题】:Simplify if else condition using timespan in C#在 C# 中使用时间跨度简化 if else 条件
【发布时间】:2018-10-29 08:57:37
【问题描述】:

我必须创建一个实时报告。为此,我必须为给定一天中的每个小时编写条件。在下面的代码中,条件检查星期几,然后检查当前时间,并根据该时间生成报告。

protected void sample()
{
    TimeSpan zerothHour = new TimeSpan(00, 0, 0);
    TimeSpan firstHour = new TimeSpan(01, 0, 0);
    TimeSpan secondHour = new TimeSpan(02, 0, 0);
    TimeSpan thirdHour = new TimeSpan(03, 0, 0);
    TimeSpan fourthHour = new TimeSpan(04, 0, 0);
    TimeSpan fifthHour = new TimeSpan(05, 0, 0);
    TimeSpan sixthHour = new TimeSpan(06, 0, 0); 
    // and so on until the twentyfourth hour
    if (DateTime.Today.DayOfWeek == DayOfWeek.Monday)
    {
        if (DateTime.Now.TimeOfDay >= sixthHour && DateTime.Now.TimeOfDay <= seventhHour)
        {
            //MySql query here
            string MyConString = ConfigurationManager.ConnectionStrings["connStr"].ConnectionString;
            MySqlConnection connection = new MySqlConnection(MyConString);
            string agentlogin = "SELECT agentlogin FROM agentdetails WHERE location = 'PNQ10-Pune' AND shift IN('6:00-15-00', '22:00-7:00') AND Mon = 'W'";
            MySqlCommand cmd = new MySqlCommand(agentlogin, connection);
            connection.Open();
            MySqlDataReader rdr = cmd.ExecuteReader();
            while (rdr.Read())
            {
               //lblagentlogin.Text += rdr["agentlogin"] + Environment.NewLine;
                sqlList.Add(Convert.ToString(rdr["agentlogin"]));
            }
        }
        else if(DateTime.Now.TimeOfDay >= seventhHour && DateTime.Now.TimeOfDay <= eigthHour)
        {

        }
        else if (DateTime.Now.TimeOfDay >= eigthHour && DateTime.Now.TimeOfDay <= ninthHour)
        {

        }
        else if (DateTime.Now.TimeOfDay >= ninthHour && DateTime.Now.TimeOfDay <= tenthHour)
        {

        }
        else if (DateTime.Now.TimeOfDay >= tenthHour && DateTime.Now.TimeOfDay <= eleventhHour)
        {

        }
        // and so on for the entire cycle of time
    }
}

上面的代码只适用于星期一,我也必须在一周的其他六天做同样的事情。当我在每个条件中添加查询时,它会像数百行一样。

有没有更好的方法来完成这项工作而无需编写数百行代码?

【问题讨论】:

  • for 循环呢?或者使用 Quartz 之类的东西进行任务调度?
  • OT DateTime.Today.TimeOfDay &lt;= seventhHour 你想使用&lt; 而不是&lt;=
  • 你也可以使用函数来简化这个任务。
  • 您确定这是正确的方法吗?您的 MySQL 查询如何因时间而异?
  • @Enigmativity 好的,我已经回滚了更改,感谢您让我知道 :)

标签: c# timespan


【解决方案1】:

这对你有用吗?

var sqls = new []
{
    "select x from y",
    "select w from q",
    // etc - 24 options
};

var sql = sqls[DateTime.Now.Hour];

甚至:

var sqls = new Action[]
{
    () => { /* sql for midnight */ },
    () => { /* sql for 1 am */ },
    // etc
    () => { /* sql for 11 pm */ },
};

var sql = sqls[DateTime.Now.Hour];

sql.Invoke();

如果你想要DayOfWeekHour,那么你可以使用这个:

var sqls = new string[][]
{
    new [] { "select x from y", "select w from q", },
    new [] { "select x from y", "select w from q", },
    new [] { "select x from y", "select w from q", },
    new [] { "select x from y", "select w from q", },
    new [] { "select x from y", "select w from q", },
    new [] { "select x from y", "select w from q", },
    new [] { "select x from y", "select w from q", },
};

var sql = sqls[(int)DateTime.Now.DayOfWeek][DateTime.Now.Hour];

根据 cmets 和其他答案,这是一种更简洁的方法:

string day = DateTime.Now.DayOfWeek.ToString().Substring(0, 3);

string[] shifts = new []
{
    "('22:00-7:00')",
    "('22:00-7:00', '6:00-15:00')",
    // 24
};

string shift = shifts[DateTime.Now.Hour];

string sql = $"SELECT agentlogin FROM agentdetails WHERE location = 'PNQ10-Pune' AND shift IN {shifts} AND {day} = 'W'";

【讨论】:

  • 不错的方法。如果我们将数组设为二维,显示天数和小时数会怎样
  • 当然,你可以有一个锯齿状数组。
  • 这更适合我认为的问题。点赞!
  • 仍在努力,尝试在此方法中获取我的查询
  • @prkash - 如果您可以提供更多您尝试在if 的每个部分中实际编写的代码示例,则可以更轻松地编写您需要的代码.看起来这将是一个相当直接的重构练习。
【解决方案2】:

听起来您可以通过动态生成 SQL 来极大地简化代码。我有点猜测,因为我不完全了解您的数据模型,但以下内容:

var dayColumns = new [] { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
var currentDayColumn = dayColumns[(int) DateTime.Now.DayOfWeek];

string shifts;

switch (DateTime.Now.Hour) {
  case 0:
    shifts = "('22:00-7:00')"
    break;
  case 6:
    shifts = "('22:00-7:00', '6:00-15:00')"
    break;
  //TODO - more cases
}

string sql = "SELECT agentlogin FROM agentdetails WHERE location = 'PNQ10-Pune' AND shift IN " + shifts + " AND " + currentDayColumn + " = 'W'";

如果您可以将班次更改为包含开始时间和结束时间的两列,则可以像这样进一步优化它:

var hour = DateTime.Now.Hour

string sql = "SELECT agentlogin FROM agentdetails WHERE location = 'PNQ10-Pune' AND " + hour + " >= shift_start_hour AND " + hour + " < shift_end_hour AND " + currentDayColumn + " = 'W'";

【讨论】:

  • 我认为这可以解决星期部分的问题,但我的表中有 10 多种班次。我是否必须在开关内创建案例组合?
  • 这可行。但也许您的数据模型也需要返工(假设您可以更改它)。班次开始和结束的小时数是否可以将班次列更改为两个整数列?
  • 我认为将您的方法与我的方法一起使用会很好。
  • 请检查与您的方法一起进行的最新编辑。它确实有效,但我必须为每个小时编写条件,这没关系,但如果有更好的方法,我想知道。而且我无法更改列,我无法控制。
  • 您可以添加另一个表格,按小时列出所有适用的班次,而不是硬编码所有小时/班次组合。然后根据将作为参数传递的小时加入该表
【解决方案3】:

假设您的 SQL 也依赖于 WeekDay + Hour(否则它没有多大意义?)您可以执行以下操作:

protected void sample()
{
    var now = DateTime.Now;
    var sql = GetSql(now.DayOfWeek, now.Hour);
    // execute sql
}

protected string GetSql(DayOfWeek dayofweek, int hour)
{
    // generate sql, using "(int)dayofweek" if needed
}

【讨论】:

    猜你喜欢
    • 2021-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2013-10-13
    相关资源
    最近更新 更多