我正在构建类似考试日程表的内容。我目前在寻找时间之间的冲突方面存在问题。
我有一个字符串列表,用于存储时间间隔,如 -
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
,因为它像以上一样存储了非常旧的系统和时间。它被用在很多地方。
答案 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
将返回一个格式化的元组,其开始和结束时间分别为Item1
和Item2
。然后你只需使用Linq的Any
函数进行过滤,并确保不返回任何属于范围内的函数。
请参阅DotNet小提琴here。