// 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); }
public void TestOffsetParse() { string text = "P99912:29:12 10/26/17 P5V1_211"; var extractor = OffsetExtractor.Build <Message>(new List <OffsetRule> { new OffsetRule { Field = "Code", Offset = 1, Length = 3 }, new OffsetRule { Field = "TimeStamp", Offset = 4, Length = 17 }, new OffsetRule { Field = "SenderName", Offset = 22, Length = 8 }, }); var message = extractor.Parse(text); Assert.AreEqual("999", message.Code); Assert.AreEqual("12:29:12 10/26/17", message.TimeStamp); Assert.AreEqual("P5V1_211", message.SenderName); }