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; } } } }
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; }
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; }