C#时间表显示工作时间为字符串,如9:00-13:00; 14:00-18:00

时间:2015-10-11 16:45:30

标签: c# math time schedule minimum-spanning-tree

我有一个星期每一天的对象列表,这些对象存储工作,而不是一周中每天的工作时间。

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。 对于一周中的一天,可以根据用户的需要输入尽可能多的时间段(工作或非工作)。 添加并将其存储到数据库不是问题。

问题在预览期间显示用户的时间段。

例如,用户输入了:

  1. 9:00-12:00工作时间
  2. 非工作时间10:00-11:00
  3. 14:00-17:00工作时间
  4. 15:00-15:30非工作时间
  5. 我需要展示所有这些:

    9:00-10:00; 11:00-12:00; 14:00-15:00; 15:30-17:00;

    更新3

    我认为这可能与图表有关。请帮助选择算法。

2 个答案:

答案 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; }
    }