public static List <PageRange> MergeAdjacent(List <PageRange> pageRangesList) { int i = pageRangesList.Count; if (pageRangesList.Count < 1) { return(pageRangesList); } List <PageRange> newList = new List <PageRange>(); PageNumber minPage = new PageNumber(); PageNumber maxPage = new PageNumber(); int minPageAsInteger = 0; int maxPageAsInteger = 0; PageRange first = pageRangesList.FirstOrDefault(); PageRange last = pageRangesList.Last(); NumberingType previousPageRangeNumberingType = new NumberingType(); bool PreviousPageRangeWasNumber = false; foreach (PageRange pageRange in pageRangesList) { PageNumber currentStartPage = pageRange.StartPage; PageNumber currentEndPage = pageRange.EndPage; if (currentEndPage == null) { currentEndPage = currentStartPage; } if (string.IsNullOrEmpty(currentEndPage.OriginalString)) { currentEndPage = currentStartPage; } int currentStartPageAsInteger = 0; int currentEndPageAsInteger = 0; bool startPageIsNumber = Int32.TryParse(currentStartPage.OriginalString.Replace(".", ""), out currentStartPageAsInteger); bool endPageIsNumber = Int32.TryParse(currentEndPage.OriginalString.Replace(".", ""), out currentEndPageAsInteger); bool IsDiscreteRange = false; bool SameNumberingType = (previousPageRangeNumberingType == pageRange.NumberingType); if (pageRangesList.Count == 1) { PageRange dummyPageRange = new PageRange(); dummyPageRange = dummyPageRange.Update(pageRange.NumberingType); Double result; if (Double.TryParse(pageRange.StartPage.ToString(), out result) == false) { newList.Add(dummyPageRange.Update(pageRange.OriginalString)); } else { newList.Add(dummyPageRange.Update(string.Format("{0}-{1}", currentStartPage.OriginalString, currentEndPage.OriginalString))); } continue; } else if (pageRange == first) { minPage = currentStartPage; maxPage = currentEndPage; minPageAsInteger = currentStartPageAsInteger; maxPageAsInteger = currentEndPageAsInteger; } else if (!PreviousPageRangeWasNumber || !SameNumberingType || !startPageIsNumber || !endPageIsNumber || pageRange.StartPage.Number == null) { IsDiscreteRange = true; } else if (currentStartPageAsInteger.CompareTo(minPageAsInteger) >= 0 && currentEndPageAsInteger.CompareTo(maxPageAsInteger) <= 0 && SameNumberingType) { // In this case, we don't have to do anything because the current page range is within the range defined by minPage & maxPage } else if (currentStartPageAsInteger.CompareTo(maxPageAsInteger + 1) < 1 && SameNumberingType) { maxPage = currentEndPage; maxPageAsInteger = currentEndPageAsInteger; } else { IsDiscreteRange = true; } if (IsDiscreteRange && pageRange == last) { PageRange dummyPageRange = new PageRange(); dummyPageRange = dummyPageRange.Update(previousPageRangeNumberingType); newList.Add(dummyPageRange.Update(string.Format("{0}-{1}", minPage.OriginalString, maxPage.OriginalString))); minPage = currentStartPage; maxPage = currentEndPage; dummyPageRange = dummyPageRange.Update(pageRange.NumberingType); newList.Add(dummyPageRange.Update(string.Format("{0}-{1}", minPage.OriginalString, maxPage.OriginalString))); } else if (IsDiscreteRange) { PageRange dummyPageRange = new PageRange(); dummyPageRange = dummyPageRange.Update(previousPageRangeNumberingType); newList.Add(dummyPageRange.Update(string.Format("{0}-{1}", minPage.OriginalString, maxPage.OriginalString))); minPage = currentStartPage; maxPage = currentEndPage; minPageAsInteger = currentStartPageAsInteger; maxPageAsInteger = currentEndPageAsInteger; } else if ((newList.Count == 0 || !PreviousPageRangeWasNumber || !SameNumberingType) && pageRange == last) { PageRange dummyPageRange = new PageRange(); dummyPageRange = dummyPageRange.Update(pageRange.NumberingType); newList.Add(dummyPageRange.Update(string.Format("{0}-{1}", minPage.OriginalString, maxPage.OriginalString))); } previousPageRangeNumberingType = pageRange.NumberingType; PreviousPageRangeWasNumber = true; } return(newList); } // end MergeAdjacent