Exemplo n.º 1
0
        private void JoinRanges(List<PagesRange> ranges)
        {
            for (int i = 0; i < ranges.Count - 1; i++)
            {
                for (int j = i + 1; j < ranges.Count; j++)
                {
                    // выбриаем два отрезка
                    var range1 = ranges[i];
                    var range2 = ranges[j];

                    // если один из них пересекает другой, то
                    if ((range1.From <= range2.From && range2.From <= range1.To) ||
                        (range1.From <= range2.To && range2.To <= range1.To))
                    {
                        // создаем новый отрезок, который является результатом объединения предыдущих двух
                        var newRange = new PagesRange(
                            Math.Min(range1.From, range2.From),
                            Math.Max(range1.To, range2.To));

                        // добавляем его в список отрезков
                        ranges.Add(newRange);

                        // а предыдущие два удаляем из списка
                        ranges.RemoveAt(Math.Max(i, j));
                        ranges.RemoveAt(Math.Min(i, j));

                        // обнуляем счётчики - начинаем просмотр списка сначала
                        i = 0;
                        j = 0;
                    }
                }
            }
        }
Exemplo n.º 2
0
        public int HowManyPagesLeft()
        {
            // TODO 3: Improve/fix the code here.
            var readPages = 0;
            var tempList = _readPages.ToList();
            foreach (var range in tempList)
            {
                _readPages.Remove(range);
                var toCut = _readPages.Where(n => (n.To <= range.To && n.From <= range.From)).ToList();
                _readPages.Add(range);
                foreach (var item in toCut)
                {
                    var tempItem = new PagesRange(item.From, range.To);
                    _readPages.Remove(item);
                    _readPages.Remove(range);
                    _readPages.Add(tempItem);
                }

            }

            _readPages.ForEach(item =>
                readPages += (item.To - item.From + 1));

            var leftPages = PagesCount - readPages;
            return leftPages;
        }
Exemplo n.º 3
0
 public int HowManyPagesLeft()
 {
     // TODO 3: Improve/fix the code here.
     // Rewritten this method. The best I could think of. (task 3)
     List<PagesRange> tmp = new List<PagesRange>(_readPages);
     for(int i = 0; i < tmp.Count-1; )
     {
         for (int j = i+1; j < tmp.Count; j++)
         {
             if ((tmp[i].From >= tmp[j].From && tmp[i].From <= tmp[j].To) ||
                 (tmp[i].To >= tmp[j].From && tmp[i].To <= tmp[j].To))
             {
                 tmp[j] = new PagesRange(Math.Min(tmp[i].From, tmp[j].From), Math.Max(tmp[i].To, tmp[j].To));
                 tmp.RemoveAt(i);
                 break;
             }
             else
             {
                 i++;
             }
         }
     }
     var readPages = tmp.Sum(item => item.To - item.From + 1);
     var leftPages = PagesCount - readPages;
     return leftPages;
 }