#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-решение.