Мне нужно добавить диапазоны и, если диапазон пропущен при добавлении, я должен отобразить сообщение - PullRequest
0 голосов
/ 23 апреля 2010

ПРИМЕР: если я добавлю диапазон {1,10} и другой диапазон {15,20}, я получу сообщение о том, что диапазоны от 11 до 14 отсутствуют.

Ответы [ 3 ]

0 голосов
/ 23 апреля 2010

Не ясно, что пытается сделать ваш код, но вот основной подход, который вы, вероятно, должны использовать:

  1. Создайте тип Range с Start и End
  2. Упорядочить коллекцию по свойству Start (возможно, используя Enumerable.OrderBy).
  3. Пройдите по парам диапазонов в упорядоченной коллекции (возможно, используя Enumerable.Zip, чтобы сжать коллекцию с смещением на единицу) и проверьте, являются ли они смежными. Если нет, укажите недостающий диапазон.
  4. Отформатируйте сообщения об ошибках, используя недостающие диапазоны, собранные из (3).

, например

var ordered = ranges.OrderBy(range => range.Start);
var pairs = ordered.Zip(ordered.Skip(1), (a, b) => new { a, b });
var missing = from pair in pairs
              where pair.a.End + 1 < pair.b.Start
              select new Range(pair.a.End + 1, pair.b.Start - 1);
0 голосов
/ 04 мая 2010

Допустимое для ввода решение и программирование Kata , использованное для его построения.

public class Range
{
    public int End;
    public int Start;

    public Range(int start, int end)
    {
        Start = start;
        End = end;
    }
}

public class RangeGapFinder
{
    public Range FindGap(Range range1, Range range2)
    {
        if (range1 == null)
        {
            throw new ArgumentNullException("range1", "range1 cannot be null");
        }

        if (range2 == null)
        {
            throw new ArgumentNullException("range2", "range2 cannot be null");
        }

        if (range2.Start < range1.Start)
        {
            return FindGap(range2, range1);
        }

        if (range1.End < range1.Start)
        {
            range1 = new Range(range1.End, range1.Start);
        }

        if (range2.End < range2.Start)
        {
            range2 = new Range(range2.End, range2.Start);
        }

        if (range1.End + 1 >= range2.Start)
        {
            return null; // no gap
        }

        return new Range(range1.End + 1, range2.Start - 1);
    }
}
0 голосов
/ 23 апреля 2010

Как вы добавляете диапазоны?

Если диапазоны добавляются по порядку, вы можете просто сохранить конец последнего диапазона и сравнить его с началом добавляемого диапазона.

Если вы можете добавлять диапазоны в любом порядке, вы должны выполнить проверку при добавлении всех диапазонов.Сортируйте диапазоны в начале диапазона, затем прокрутите диапазоны и сравните конец диапазона с началом следующего диапазона.

update

Пример второго случая.Первый класс для хранения диапазонов:

public class Range {

  public int From { get; private set; }
  public int To { get; private set; }

  public Range(int from, int to) {
    From = from;
    To = to;
  }

}

Создание списка диапазонов:

List<Range> ranges = new List<Range>();
ranges.Add(new Range(15, 20));
ranges.Add(new Range(1, 10));

Проверка диапазонов:

ranges = ranges.OrderBy(r => r.From).ToList();
for (int i = 1; i < ranges.Count; i++) {
  int to = ranges[i - 1].To;
  int from = ranges[i].From;
  int diff = to.CompareTo(from - 1);
  if (diff < 0) {
    Response.Write("Range from " + (to + 1).ToString() + " to " + (from - 1).ToString() + " is missing<br/>");
  } else if (diff > 0) {
    Response.Write("Range ending at " + to.ToString() + " overlaps range starting at " + from.ToString() + "<br/>");
  }
}

Примечание. Код проверяет наличиеоба пробела в диапазонах и перекрывающихся диапазонах.Если перекрывающиеся диапазоны не являются проблемой, просто удалите деталь, которая проверяет diff > 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...