Проверка на наличие пробелов в диапазоне

#c#

#c#

Вопрос:

Мне нужно проверить, заполняют ли некоторые объекты внутри базы данных определенный диапазон, т.е. 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);
    }
}
 

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

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

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

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

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

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

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

Помочь?

Комментарии:

1. Нужны ли вам интервалы в виде пар начальной точки / конечной точки или вам просто нужны все целые числа, которые не отображаются в этом диапазоне по порядку? т.е. Вы просто хотите, чтобы результат был 1,4,5,6,7 или вы хотите, чтобы он был 1-1, 4-7?

2. Также каков ваш объект диапазона? Кажется, я нигде не могу его найти…

Ответ №1:

 00000000000000000000000000000
|              |
8:00           9:00                       
 

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

 11110001111110001111000111000
 

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

Комментарии:

1.@Джордж, Зачем тебе это нужно? Вы должны выполнять побитовые операции, такие как and xor etc. Или ты спрашиваешь bitArray.Set(index,bool) ?

2. Хм, это правда, LB. Это может сделать это!

Ответ №2:

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

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

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

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

—РЕДАКТИРОВАТЬ

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

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

Комментарии:

1. спасибо за классное решение, но я обновлю свой пост. Я не могу использовать необработанный sql для решения. Это должно быть чистое CLR-решение.