/// <summary> /// Find matching ranges that contain timeToCheck /// </summary> /// <param name="timeToCheck"></param> /// <returns></returns> public IEnumerable <SlotTimeRange> MatchingRange(DateTime timeToCheck) { var returnValue = new List <SlotTimeRange>(); returnValue.AddRange(TimeRanges.Where(x => x.BeginDate <= timeToCheck && x.EndDate >= timeToCheck)); return(returnValue); }
/// <summary> /// Az adott időintervallumot hozzáadja a listában szereplőkhöz. Ha összeér, vagy belelóg egy vagy több már megjelölt időintervallumba, akkor összevonja az egybeérő időintervallumokat. /// </summary> public void AddTimeRange(TimeRange timeRange) { ReloadData(); if (TimeUnit == TimeUnit.Infinity) { if (!TimeRanges.Any()) { AddTimeRangeToList(TaskControl_TimeRange.Infinity()); } } else { var tcTimeRange = newTaskControl_TimeRange(timeRange.DateTimeStart, timeRange.DurationCount); /*var prev = TimeRanges.Where(x => x.DateTimeStart <= timeRange.DateTimeStart).OrderByDescending(x => x.DateTimeStart).FirstOrDefault(); * var next = TimeRanges.Where(x => x.DateTimeStart >= timeRange.DateTimeStart).OrderBy(x => x.DateTimeStart).FirstOrDefault(); * AddTimeRangeToList(timeRange); * * //előző bejegyzéshez vizsgálat+mergelés * MergeInList(timeRange, prev); * * //következő bejegyzéshez vizsgálat+mergelés * MergeInList(timeRange, next);*/ //kitörlöm az összes intervallumot, amit teljesen befed a hozzáadandó intervallum. var toDelete = TimeRanges .Where(x => x.DateTimeStart >= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) <= tcTimeRange.EndOfTimeRange(TimeUnit)) .ToList(); foreach (var tr in toDelete) { RemoveTimeRangeFromList(tr); } //megnézem, van e olyan intervallum, amit a hozzáadandó időszak kezdetével összeér. var startIntersecting = TimeRanges .Where(x => x.DateTimeStart <= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.DateTimeStart) .FirstOrDefault(); //megnézem, van e olyan intervallum, amit a hozzáadandó időszak végével összeér. var endIntersecting = TimeRanges .Where(x => x.DateTimeStart <= tcTimeRange.EndOfTimeRange(TimeUnit) && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.EndOfTimeRange(TimeUnit)) .FirstOrDefault(); var worktr = newTaskControl_TimeRange(tcTimeRange.DateTimeStart, tcTimeRange.DurationCount); // Hozzáadoma listához az új időintervallumot AddTimeRangeToList(worktr); //megnézem, van e olyan intervallum, amit a hozzáadandó időszak kezdetével összeér. Ha van ilyen, akkor összevonom a hozzáadandó időszakkal. var mergedtr = MergeInList(worktr, startIntersecting); //megnézem, van e olyan intervallum, amit a hozzáadandó időszak végével összeér. Ha van ilyen, akkor összevonom a hozzáadandó időszakkal. MergeInList(mergedtr, endIntersecting); } //Az új időintervallumot felveszem a listába SaveChanges(); }
/// <summary> /// Az adott időintervallumot kiveszi a listából. /// </summary> public void RemoveTimeRange(TimeRange timeRange) { ReloadData(); if (TimeUnit == TimeUnit.Infinity) { foreach (var tr in TimeRanges.ToList()) { RemoveTimeRangeFromList(tr); } } else { var tcTimeRange = newTaskControl_TimeRange(timeRange.DateTimeStart, timeRange.DurationCount); //1. megnézem, van e olyan intervallum, amit a törlendő időszak kezdetével összeér. Ha van ilyen, kettébontom 2 időszakra. var startIntersecting = TimeRanges .Where(x => x.DateTimeStart <= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.DateTimeStart) .FirstOrDefault(); SplitInList(startIntersecting, tcTimeRange.DateTimeStart); //2. megnézem, van e olyan intervallum, amit a törlendő időszak végével összeér. Ha van ilyen, kettébontom 2 időszakra. var entIntersecting = TimeRanges .Where(x => x.DateTimeStart <= tcTimeRange.EndOfTimeRange(TimeUnit) && x.EndOfTimeRange(TimeUnit) >= tcTimeRange.EndOfTimeRange(TimeUnit)) .FirstOrDefault(); SplitInList(entIntersecting, tcTimeRange.EndOfTimeRange(TimeUnit)); //3. kitörlöm az összes intervallumot, amit teljesen befed a törlendő intervallum. var toDelete = TimeRanges .Where(x => x.DateTimeStart >= tcTimeRange.DateTimeStart && x.EndOfTimeRange(TimeUnit) <= tcTimeRange.EndOfTimeRange(TimeUnit)) .ToList(); foreach (var tr in toDelete) { RemoveTimeRangeFromList(tr); } } //Az új időintervallumot felveszem a listába SaveChanges(); }
/// <summary> /// Invertálja a Timeranges-t. Olyan időintervallumokat tartalmazó TimeControl -t ad vissza, ami a beadott dátumok közötti összes meg nem jelölt időszakot tartalmazza. /// </summary> public TaskControl GetInverseTimeControl(TimeRange timeRange) { var res = new TaskControl(TimeUnit); ReloadData(); if (TimeUnit == TimeUnit.Infinity) { if (TimeRanges.Any()) { res.RemoveTimeRange(TimeRange.Infinity()); } else { res.AddTimeRange(TimeRange.Infinity()); } } else { //Ez az az időpont, amelyik már éppen NINCS benne a vizsgált időszakban DateTime realStartTime = TimeFunctions.TruncDateTime(TimeUnit, timeRange.DateTimeStart); DateTime realEndTime = timeRange.EndOfTimeRange(TimeUnit); /*if (TimeType == TimeType.Moment)//Ha időpontot vizsgálok, akkor a záró időpontot kiterjesztem a megadott időpontot tartalmazó időszak végéig. * realEndTime = AddDateTime(realEndTime, 1); * else//Ha időszakot vizsgálok, akkor a kapott endtime paraméterben levő időpontot még intervallumon belülinek veszem, ezért a záró időpontot kiterjesztem 1 legkisebb időegységgel. * realEndTime = realEndTime/*.AddTicks(1)*/ ; //realEndTime = var trInInterval = TimeRanges.Where(x => x.EndOfTimeRange(TimeUnit) > realStartTime && x.DateTimeStart < realEndTime).OrderBy(x => x.DateTimeStart); //első időszak előtti rész var first = trInInterval.FirstOrDefault(); if (first != null && first.DateTimeStart > realStartTime) { var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, first.DateTimeStart)); res.TimeRanges.Add(tr); } TaskControl_TimeRange?prevTimeRange = null; //hozzáadom az egyes időintervallumok között kihagyott időszakokat foreach (var actTimeRange in trInInterval) { if (prevTimeRange != null) { var starttime = prevTimeRange.EndOfTimeRange(TimeUnit); var tr = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, actTimeRange.DateTimeStart)); if (tr.DurationCount > 0) { res.TimeRanges.Add(tr); } } prevTimeRange = actTimeRange; } //hozzáadom az utolsó utáni-t var last = trInInterval.LastOrDefault(); if (last != null && AddDateTime(last.DateTimeStart, last.DurationCount) < realEndTime) { var starttime = last.EndOfTimeRange(TimeUnit); var tr = newTaskControl_TimeRange(starttime, TimeCountBetween(starttime, realEndTime)); if (tr.DurationCount > 0) { res.TimeRanges.Add(tr); } } if (!trInInterval.Any()) { var tr = newTaskControl_TimeRange(realStartTime, TimeCountBetween(realStartTime, realEndTime)); res.TimeRanges.Add(tr); } } return(res); }