我有一个星期每一天的对象列表,这些对象存储工作,而不是一周中每天的工作时间。
public class Schedule
{
public bool IsOn { get; set; }
public DayOfWeek DayOfWeek { get; set; }
public short TimeFrom { get; set; } // store time as amount of minutes since start of day
public short TimeTo { get; set; } // store time as amount of minutes since start of day
}
所以我想要得到的是每周一天的时间范围。 例如,星期一我们有两个项目
new Schedule() { IsOn = true, DayOfWeek = DayOfWeek.Moday, TimeFrom = 540, TimeTo = 1080 }
new Schedule() { IsOn = false, DayOfWeek = DayOfWeek.Moday, TimeFrom = 780, TimeTo = 840 }
我需要在UI上显示: 周一:9:00-13:00; 14:00-18:00
更新
我想知道的主要问题是如何解决这种问题的算法。 如果你看例子星期一:9:00-13:00; 14:00-18:00 你会看到我只想显示工作时间。 我认为它类似于TimeRange,但我不知道如何编写代码。
更新2
为了更清楚,我将提供一个例子。 用户可以输入一段时间的工作时间,例如9:00-12:00 用户也可以输入非工作时间的程序,例如10:00-11:00。 对于一周中的一天,可以根据用户的需要输入尽可能多的时间段(工作或非工作)。 添加并将其存储到数据库不是问题。
问题在预览期间显示用户的时间段。
例如,用户输入了:
我需要展示所有这些:
9:00-10:00; 11:00-12:00; 14:00-15:00; 15:30-17:00;
更新3
我认为这可能与图表有关。请帮助选择算法。
答案 0 :(得分:3)
以下内容应该为您提供所需的输出。使用您给出的样本数据就是结果。
<强>输出强>
周一:09:00-18:00; 13:00-14:00
<强>代码强>
$_POST['submit']
答案 1 :(得分:0)
最后,我找到了解决方案。
public static IEnumerable<Tuple<short, short>> ExcludeIntervals(IEnumerable<ISchedule> range)
{
var list = range
.SelectMany(x => new[] {Tuple.Create(x.TimeFrom, x.IsOn), Tuple.Create(x.TimeTo, !x.IsOn)})
.OrderBy(d => d.Item1).ThenBy(d => d.Item2)
.ToList();
var first = default(short);
var count = 1;
foreach (var item in list)
{
if (item.Item2) // false - start of unavailability interval. true - end of unavailability interval.
{
if (--count == 0) // Become available.
{
first = item.Item1;
}
}
else
{
if (++count == 1)
{
var last = item.Item1;
if (last >= first) // if next unavailability starts right after previous ended, then no gap.
{
yield return Tuple.Create(first, last);
}
}
}
}
}
public interface ISchedule
{
bool IsOn { get; set; }
short TimeFrom { get; set; }
short TimeTo { get; set; }
}