【问题标题】:C# DateTime Format and ComparisonC# DateTime 格式及比较
【发布时间】:2018-06-18 05:15:34
【问题描述】:

我正在为我的大学编写课程安排程序,但在 C# 中进行比较时遇到了一些问题。对于每门课程,给定的日期时间都是这样的字符串格式:

 string Start_Time = "10:00";
 string End_Time = "10:50";

我需要将这些转换为 DateTime 格式(最好限制为 HH:mm),然后进行比较以确保课程之间没有重叠。我当前要检查的代码如下所示。

static bool checkTimes(Courses courseOne, Courses courseTwo)
    {
        bool overlapChecker = false;

        // Get comparison values for course times
        DateTime s1 = Convert.ToDateTime(courseOne.Start_Time);
        DateTime s2 = Convert.ToDateTime(courseTwo.Start_Time);
        DateTime e1 = Convert.ToDateTime(courseOne.End_Time);
        DateTime e2 = Convert.ToDateTime(courseTwo.End_Time);

        // Check for overlapping days of the week
        foreach (char c1_days in courseOne.Days)
        {
            foreach (char c2_days in courseTwo.Days)
            {
                if (c1_days == c2_days)
                {
                    overlapChecker = true;
                }
            }
        }

        // If there are any overlapping days, compare DateTimes of courses for overlap
        if (overlapChecker == true)
        {
            // Compare all possibilities of time overlap
            if ((s2 >= s1 && s2 <= e1) || (e1 >= s1 && e1 <= e2))
            {
                return true;
            }
        }
        return false;
    }

目前,这不起作用。我不太确定我哪里出错了,但任何帮助都会非常感激。谢谢!

【问题讨论】:

  • s1 的值是多少? s2? e1? e2? overlapChecker ? 别猜了,跑起来看看。
  • 您能添加课程类定义以及您如何调用 checkTimes 吗?
  • 如果可能,还添加 Courses 类和一些实例来玩。肯定会帮助其他人准确轻松地找出代码。
  • 你可以用这个替换overlapChecker foreach 循环:var overlapChecker = courseOne.Days.Any(d =&gt; courseTwo.Days.Contains(d))

标签: c# datetime boolean comparison overlap


【解决方案1】:

我在这里做了一个几乎没有假设的rextester - http://rextester.com/UDI9335

假设:

  1. 您的Course 课程如下。

    public class Course {
        public string cName { get; set; }
        public string Start_Time { get; set; }
        public string End_Time { get; set; }
        public List<string> Days { get; set; }
    }
    
  2. 课程在所有给定的日期同时进行。 (根据您的代码)
  3. DaysstringsList,我暂时想到了M, T, W, T, F 之类的字符列表或数组,但这会给出不正确的结果,因为T 正在重复。周二和周四

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Globalization;

namespace Rextester
{
    public class Program
    {
        public static void Main(string[] args)
        {

            Course c1 = new Course{
                cName = "Course 1",
                Start_Time = "10:00",
                End_Time = "10:50",
                Days = new List<string>{ "Mon", "Tue", "Wed"}
            };

            Course c2 = new Course{
                cName = "Course 2",
                Start_Time = "10:40",
                End_Time = "11:20",
                Days = new List<string>{ "Wed", "Thu", "Fri"}
            };

            Course c3 = new Course{
                cName = "Course 3",
                Start_Time = "11:30",
                End_Time = "12:20",
                Days = new List<string>{ "Mon", "Tue", "Fri"}
            };


            bool areC1C2Clashing = areCoursesClashing(c1, c2);
            Console.WriteLine("Are c1 & c2 clashing - " + areC1C2Clashing);
            Console.WriteLine();

            bool areC2C3Clashing = areCoursesClashing(c2, c3);
            Console.WriteLine("Are c2 & c3 clashing - " + areC2C3Clashing);
            Console.WriteLine();

            bool areC1C3Clashing = areCoursesClashing(c1, c3);
            Console.WriteLine("Are c1 & c3 clashing - " + areC1C3Clashing);
            Console.WriteLine();
        }

        public static bool areCoursesClashing(Course cA, Course cB){
            bool clashDetected = false;
            foreach(var coruseDay in cA.Days){
                if(cB.Days.Contains(coruseDay)){

                    DateTime cAStartTime = DateTime.ParseExact(cA.Start_Time, "HH:mm", CultureInfo.InvariantCulture);
                    DateTime cAEndTime = DateTime.ParseExact(cA.End_Time, "HH:mm", CultureInfo.InvariantCulture);
                    DateTime cBStartTime = DateTime.ParseExact(cB.Start_Time, "HH:mm", CultureInfo.InvariantCulture);
                    DateTime cBEndTime = DateTime.ParseExact(cB.End_Time, "HH:mm", CultureInfo.InvariantCulture);

                    if( cAStartTime < cBEndTime && cBStartTime < cAEndTime){
                        Console.WriteLine("WARNING!!! Classes clash for --> " + cA.cName + " & " + cB.cName);
                        clashDetected = true;
                    }
                }
            }
            return clashDetected;
        }
    }

    public class Course {
        public string cName { get; set; }
        public string Start_Time { get; set; }
        public string End_Time { get; set; }
        public List<string> Days { get; set; }
    }
}

输出:

警告!!!课程冲突 --> 课程 1 和课程 2

c1 和 c2 是否冲突 - 是的

c2 和 c3 是否冲突 - 错误

c1 和 c3 是否冲突 - 错误

【讨论】:

  • 谢谢!我不得不稍微修改一下这里的代码,但这确实解决了我的问题。作为旁注,我在一周的几天中使用带有字符“MTWRF”的字符串值,这样我可以将 Course.Days 存储为字符串,从而减少存储列表所需的空间。为了检查比较,我只是用嵌套的 foreach 循环遍历了字符串字符。从技术上讲,复杂度可能是 O(N^2),但由于 N 的最大值是 5(我正在编写的程序实际上是 4),我觉得这是可以接受的。
  • 啊,我知道你对Days 做了什么。由于重复了我所说的 T,我无法想到这一点,但很高兴我的意见有所帮助。
【解决方案2】:

您可以分两步。 首先 => 在模型“课程”中创建将字符串转换为日期时间的方法,例如:

public DateTime StartTime()
{
    return new DateTime(2018,6,18,this.Start_Time.split(':')[0],this.Start_Time.split[1]);
}

Second => 覆盖 Courses 的 equals 方法:

public override bool equals(object entity)
{
    var temp = entity as Courses;
    if (temp == null) return false;
    //Logics for a Course is equal to another Course
    If (this.StartTime == temp.StartTime)
        return true;
    return false;
}

你不能有一个方法“CheckTimes”,只需调用:

bool result = CourseOne.equals ( CouseTwo );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    • 2018-01-16
    • 2011-01-11
    • 2016-11-01
    • 1970-01-01
    • 2013-12-11
    相关资源
    最近更新 更多