// Reasonably simple way of computing the maximum/minimum offset
        // from either periods or transitions, with or without a tail zone.
        private static Offset ComputeOffset <T>(IEnumerable <T> elements,
                                                OffsetExtractor <T> extractor,
                                                DateTimeZone tailZone,
                                                OffsetAggregator aggregator)
        {
            Preconditions.CheckNotNull(elements, "elements");
            Offset ret;

            using (var iterator = elements.GetEnumerator())
            {
                var hasFirst = iterator.MoveNext();
                Preconditions.CheckArgument(hasFirst, "iterator", "No transitions / periods specified");
                ret = extractor(iterator.Current);
                while (iterator.MoveNext())
                {
                    ret = aggregator(ret, extractor(iterator.Current));
                }
            }
            if (tailZone != null)
            {
                // Effectively a shortcut for picking either tailZone.MinOffset or
                // tailZone.MaxOffset
                Offset bestFromZone = aggregator(tailZone.MinOffset, tailZone.MaxOffset);
                ret = aggregator(ret, bestFromZone);
            }
            return(ret);
        }
Exemplo n.º 2
0
        // Reasonably simple way of computing the maximum/minimum offset
        // from either periods or transitions, with or without a tail zone.
        private static Offset ComputeOffset([NotNull] ZoneInterval[] intervals,
                                            DateTimeZone tailZone,
                                            OffsetAggregator aggregator)
        {
            Preconditions.CheckNotNull(intervals, nameof(intervals));
            Preconditions.CheckArgument(intervals.Length > 0, nameof(intervals), "No intervals specified");
            Offset ret = intervals[0].WallOffset;

            for (int i = 1; i < intervals.Length; i++)
            {
                ret = aggregator(ret, intervals[i].WallOffset);
            }
            if (tailZone != null)
            {
                // Effectively a shortcut for picking either tailZone.MinOffset or
                // tailZone.MaxOffset
                Offset bestFromZone = aggregator(tailZone.MinOffset, tailZone.MaxOffset);
                ret = aggregator(ret, bestFromZone);
            }
            return(ret);
        }
 // Reasonably simple way of computing the maximum/minimum offset
 // from either periods or transitions, with or without a tail zone.
 private static Offset ComputeOffset([NotNull] ZoneInterval[] intervals,
     IZoneIntervalMapWithMinMax tailZone,
     OffsetAggregator aggregator)
 {
     Preconditions.CheckNotNull(intervals, nameof(intervals));
     Preconditions.CheckArgument(intervals.Length > 0, nameof(intervals), "No intervals specified");
     Offset ret = intervals[0].WallOffset;
     for (int i = 1; i < intervals.Length; i++)
     {
         ret = aggregator(ret, intervals[i].WallOffset);
     }
     if (tailZone != null)
     {
         // Effectively a shortcut for picking either tailZone.MinOffset or
         // tailZone.MaxOffset
         Offset bestFromZone = aggregator(tailZone.MinOffset, tailZone.MaxOffset);
         ret = aggregator(ret, bestFromZone);
     }
     return ret;
 }