/// <summary> /// add a work into event queue /// ワークをキューに追加(時間順。同時刻なら後の方に) /// </summary> /// <param name="workOrKanban">object either work or kanban</param> /// <returns></returns> public JitVariable Enqueue(DateTime dt, EventTypes type, JitVariable workOrKanban) { PrepareDummyItems(dt); LinkedListNode <Item> node; if (_sections.TryGetValue(TimeUtil.ClearSeconds(dt), out var topnode) == false) // 分毎にシーク位置をスキップできる { topnode = _dat.First; } for (node = topnode; node != null; node = node.Next) // 挿入位置を捜す { if (node.Value.DT > dt) { break; } } var item = new Item { DT = dt, Work = workOrKanban as JitWork, Kanban = workOrKanban as JitKanban, Type = type, }; if (node == null) // ポカヨケ { _dat.AddLast(item); } else { _dat.AddBefore(node, item); } return(workOrKanban); }
/// <summary> /// make dummy event item that is sake for speed finding /// 分毎のダミーListNodeを作成する(検索高速化) /// </summary> /// <param name="dt"></param> private void PrepareDummyItems(DateTime dt) { if (_dat.Count > 0) { return; } for (var t = TimeUtil.ClearSeconds(dt); t < dt + TimeSpan.FromDays(2); t += TimeSpan.FromMinutes(1)) { var node = _dat.AddLast(new DummyItem // 検索の速度を上げるための分毎のダミーItem { DT = t, Work = null, }); _sections[t] = node; } }