Тест на разрывы в диапазоне - PullRequest
0 голосов
/ 26 октября 2011

Мне нужно проверить, заполняют ли некоторые объекты в базе данных определенный диапазон, т. Е. 0-999.

Я использую C # и создал универсальный класс с использованием IComparable для проверки на пересечение.Это работает нормально, но мне нужно инвертировать и найти все пробелы, которые у меня есть в этом интервале.

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

foreach (var interval in intervals)
{
    for (int i = 0; i <= 999; i++)
    {
        if (Range<int>.Intersects(interval,new Range<int>(i,i)))
            continue;
        else
            doesNotIntersect.Add(i);
    }
}

С этим кодом у меня есть симпатичный список «дыр».Сейчас я пытаюсь сгруппировать эти значения, но я считаю, что мое решение не оптимально и, конечно, не элегантно.

Я читал о BitArrays, но как они могут мне помочь?Я хотел бы, чтобы из списка диапазонов я мог найти пропуски в фиксированном диапазоне.Если мы говорим о строке, мне нужен в основном результат с фиксированными интервалами.

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

Позвольте мне попытаться создать рисунок

Фиксированный диапазон, который необходимо заполнить

111111111

Диапазоны, которые предоставлены объектами

101100001

Диапазоны, которые необходимо заполнить

010011110

Это мой объект диапазона:

public class Range<T> where T : IComparable
{
    public T Start { get; set; }
    public T End { get; set; }

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

    public static bool Intersects(Range<T> left,Range<T> right)
    {
        if (left.Start.CompareTo(right.Start) == 0)
            return true;

        if (left.Start.CompareTo(right.Start) > 0)
        {
            return left.Start.CompareTo(right.End) <= 0;
        }

        return right.Start.CompareTo(left.End) <= 0;
    }
}

Мне нужно найти разрывы в начальных конечных точках вместо непрерывных интервалов.

Помощь

Ответы [ 2 ]

0 голосов
/ 26 октября 2011

Вы можете использовать SQL для этого, если целое значение может быть представлено сущностью.Затем просто создайте таблицу с одним столбцом seq, где все значения находятся в диапазоне от 0 до 999, затем, используя левое внешнее объединение, объедините таблицу с этой сущностью и выберите только те идентификаторы, в которых сущность равна нулю.

Пример запроса должен выглядеть следующим образом.

SELECT ts.seq
 FROM sequenceTable ts LEFT OUTER JOIN sourceTable st ON ts.seq = st.entity
WHERE st.entity is null;  

Вы можете использовать номер строки для создания столбца seq таблицы seauenceTable.

- EDIT

Поскольку решение должно быть в CLR, вы можете использовать командуКоллекции, создайте список со значениями от 0 до 999, затем удалите все из этих интервалов.

Следующее решение - использование логического массива.Создайте массив правильной длины (в данном случае 999), затем выполните итерации по интервалам и используйте интервал в качестве индекса, где значение true для него в логическом массиве, затем просто повторите итерацию по этому массиву, и пропущенные интервалы будут представлены индексомгде значение ложно.

0 голосов
/ 26 октября 2011
00000000000000000000000000000
|              |
8:00           9:00                       

Предположим, что каждый '0' в битовом массиве представляет единицу времени (секунда, час и т. Д.). Начните цикл с интервалами и установите биты в соответствии со значениями начала и конца.Теперь у вас будет что-то вроде этого

11110001111110001111000111000

«0» - это ваши сгруппированные пробелы

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