コード例 #1
0
        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