如何对多维字典的内部值进行排序

本文关键字:内部 排序 字典 | 更新日期: 2023-09-27 18:34:50

我正在创建一个Windows服务,该服务控制一堆其他进程,但内部进程需要按照自己的计划运行。每个计划都相对简单,只需选择它们在一周中的哪几天运行,何时开始流程以及何时停止。

我的想法是有一个多维字典

,如下所示
Dictionary<string, TimeSpan> OnOff = new Dictionary<string,TimeSpan>();
OnOff.Add("Start", TimeSpan.Parse("09:00"));
OnOff.Add("Stop", TimeSpan.Parse("17:00"));
Dictionary<string, Dictionary<string, TimeSpan>> Process = new Dictionary<string,Dictionary<string,TimeSpan>>();
Process.Add("Process1", OnOff);
Dictionary<DayOfWeek, Dictionary<string, Dictionary<string, TimeSpan>>> schedule = new Dictionary<DayOfWeek,Dictionary<string,Dictionary<string,TimeSpan>>>();
schedule.Add(DayOfWeek.Monday, Process);

并按最接近的"开关"时间跨度对"进程"字典进行排序,然后再使用简单计时器在 TimeSpan 到达时对进程的下一个操作进行操作。

我对这个计划的问题是对时间跨度进行排序,并找出哪个"开始"/"停止"操作包含最接近的排序时间跨度。此外,它可能是包含最接近 TimeSpan 的每个进程的不同操作。

或者谁能想到一种更简单的方法来达到相同类型的结果?

如何对多维字典的内部值进行排序

为什么不只保留一个结构

`class ProcessInfo
{
String ProcessID;
TimeSpan startTime;
TimeSpan endTime;
}`

并保持字典的结构简单 Dictionary<string,ProcessInfo> schedule = new Dictionary<string,ProcessInfo>();只需在需要添加到列表时创建一个新的进程信息对象

由于计划信息始终存在于 App.Config 文件中,我决定不需要将其存储在其他地方。我处理调度的方法是找到所有需要在不久的将来采取行动的流程,并只存储这些流程详细信息、调度时间和所需的操作。

然后我只是运行一个计时器,并在计划时间执行启动或停止操作。处理完所有这些进程后,我再次查看了 App.Config,并找到了下一个要处理的进程列表。

    // The method that will be called when the schedule thread is started
    private void ProcessSchedule()
    {
        Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
        // work out the length of time between now and the schedule time
        string today = DateTime.Now.ToString("dd.MM.yyy");
        DateTime abaseTime = Convert.ToDateTime(today);
        TimeSpan scheduleTime = schedules.First().Value.ActionTime;
        DateTime actionTime = abaseTime.Add(scheduleTime);

        // log the schedule is starting
        if (log.IsInfoEnabled) log.Info(String.Format("Schedule created. Next action will take place at {0}", actionTime.ToString()));
        while (Running)
        {
            // this kills this process
            if (threadStop.WaitOne(0))
            {
                if (log.IsInfoEnabled) log.Info(String.Format("Schedules cancelled"));
                break;
            }
            if (DateTime.Now < actionTime)
            {
                //sleep 5 seconds before checking again. If we go any longer we keep our service from shutting down when it needs to.
                threadStop.WaitOne(5000);
                continue;
            }
            // tell the service control that it can action the schedules now
            ServiceControl.actionSchedule.Set();
            break;
        }

    }