如何检查字符串是否存在时间冲突,如下午6:00到晚上9:00

时间:2016-09-22 15:30:17

标签: c#

我正在构建类似考试日程表的内容。我目前在寻找时间之间的冲突方面存在问题。

我有一个字符串列表,用于存储时间间隔,如 -​​

List<string> times = new List<string>();
times.Add("6:00 PM to 9:00 PM");
times.Add("10:00 AM to 1:00 PM");

现在假设,如果想在列表中添加以下时间,我首先要检查它是否与已经存在的时间冲突。

因此,在下面的情况下,不应该添加它。

if(NotConflict("5:00 PM to 7:00 PM"))
    times.Add("5:00 PM to 7:00 PM");

但是由于没有冲突,可以添加以下内容。

if(NotConflict("2:00 PM to 5:00 PM"))
    times.Add("2:00 PM to 5:00 PM");

我不能在这里使用DateTime,因为它像以上一样存储了非常旧的系统和时间。它被用在很多地方。

1 个答案:

答案 0 :(得分:3)

这应该有效:

private static Tuple<DateTime, DateTime> ParseDate(string dateTimes)
{
    var split = dateTimes.Split(new[] { " to " }, StringSplitOptions.None);
    var time1 = DateTime.ParseExact(split[0], "h:mm tt",
                                        CultureInfo.InvariantCulture);
    var time2 = DateTime.ParseExact(split[1], "h:mm tt",
                                        CultureInfo.InvariantCulture);

    return Tuple.Create(time1, time2);
}


private static bool NotConflict(IEnumerable<string> times, string time) {
    var incTime = ParseDate(time);

    return !times.Any(t => {
        var parsed = ParseDate(t);


        return incTime.Item1 <= parsed.Item2 && parsed.Item1 <= incTime.Item2;
    });
}

public static void Main()
{
    var times = new List<string>();
    times.Add("6:00 PM to 9:00 PM");
    times.Add("10:00 AM to 1:00 PM");

    Console.WriteLine("No Conflict 5:00 PM to 7:00 PM: {0}", NotConflict(times, "5:00 PM to 7:00 PM"));
    Console.WriteLine("No Conflict 2:00 PM to 5:00 PM: {0}", NotConflict(times, "2:00 PM to 5:00 PM"));
}

ParseDate将返回一个格式化的元组,其开始和结束时间分别为Item1Item2。然后你只需使用Linq的Any函数进行过滤,并确保不返回任何属于范围内的函数。

请参阅DotNet小提琴here