Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Толик Панков ([info]hex_laden) в [info]csharp_dotnet
@ 2014-04-11 05:35:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Entry tags:исходники, строки, числа

Класс для работы с диапазонами чисел.
Точнее, написать надо было класс, который сможет проанализировать строку, где через запятую перечислены числовые значения, как одиночные, так и заданные отрезками: НачальноеЧисло-КонечноеЧисло.
НачальноеЧисло должно быть меньше КонечноеЧисло.
Например: 1, 114, 21-30. И в дальнейшем показать, входит ли заданное значение в ранее установленный диапазон. Но заодно уж добавил и остальные функции. Строки такие, например, встречаются в окне печати Word (номера страниц)

Свойства класса:
bool AllowRepeats - В случае истинности значения AllowRepeats в диапазоне разрешены повторы значений.
2 конструктора - 1 создает класс с AllowRepeats==true, 2 позволяет задать AllowRepeats
Методы:
AddInDiapason (long Value) - Добавляет в диапазон значение Value
AddInDiapason(long StartValue, long EndValue) - Добавляет в диапазон значения, начиная со StartValue и заканчивая EndValue включительно
AddFromString(string DiapasonString) - добавляет в диапазон значения из вышеописанной строки, если не получилось возвращает false.
Clear() - Очищает значения диапазона
InDiapasonCount(long Value) - Возвращает, сколько раз встречается значение Value в диапазоне.
SortDiapason(SortOrder Order) - Сортирует диапазон по возрастанию или убыванию в зависимости от заданного параметра Order
SortOrder описана как:

public enum SortOrder
        {
            byAscending = 0,
            byDescending = 1
        }

ToArray() - Возвращает массив, содержащий значения диапазона.
InDiapason(long Value) - Проверяет, входит ли значение Value в диапазон (возвращает true или false)
GetIndexes(long Value) - Получает индексы элементов, равных значению Value
RemoveAt(int Index) - Удаляет элемент с индексом Index, генерирует исключение если индекс вне диапазона.
Remove(long Value) - Удаляет из диапазона все значения Value
Remove(long StartValue, long EndValue) - Удаляет из диапазона все значения, начиная со StartValue и заканчивая EndValue
RemoveInDiapason(string DiapasonString) - Удаляет из диапазона все значения, заданные строкой DiapasonString
GetValue(int Index) - Возвращает значение элемента с индексом Index
SetValue(int Index, long Value) - Устанавливает элементу с индексом Index значение Value
ReplaceValue(long OldValue, long NewValue) - Заменяет в диапазоне значения равные OldValue на значения NewValue
MaxValue(out long Value) - Возвращает максимальное значение элемента диапазона в переменную Value. Возвращает false в случае, если диапазон не заполнен значениями.
MinValue(out long Value) - Возвращает минимальное значение элемента диапазона в переменную Value. Возвращает false в случае, если диапазон не заполнен значениями.
Скачать исходник класса
Скачать демо


(Добавить комментарий)


[info]steinkrauz
2014-04-11 10:03 (ссылка)
1. Будет тормозить на больших диапазонах
2. Не поддерживает диапазоны с открытым концом.
3. MaxValue(out long Value), MinValue(out long Value) -- почему не функциями? Логичнее было бы

(Ответить) (Ветвь дискуссии)


[info]hex_laden
2014-04-11 13:59 (ссылка)
1. Будет тормозить на больших диапазонах.
Насколько больших? И можно ли что-то оптимизировать? Оно вроде как и не надо (задача не основная), но если будет как-то можно улучшить и углУбить, то с удовольствием сделал бы. Пусь будет красивый класс (а то вокруг один первый канал, надо творить добро в исходниках).

2. Не поддерживает диапазоны с открытым концом.
Т.е. например [666..+бесконечность]? Для порядка стоит добавить.

3. MaxValue(out long Value), MinValue(out long Value) -- почему не функциями? Логичнее было бы
В смысле? т.е. значение передается не по out, а возвращается функцией? Тогда исключение придется генерировать, если список пуст. Или ты имеешь ввиду, что у List есть стандартные функции для поиска min и max? Вроде ж нет.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]steinkrauz
2014-04-11 16:00 (ссылка)
1. Думаю, на десятках-сотнях тысяч будет уже заметно, особенно если обращение к классу будет в цикле. Понятно, что пока диапазоны типа 1-3,6, 8-10 это незаметно. А вот если 123000-489394, 554098, 640938-1029485 -- уже другое дело.

2. Ага, они

3. Я в виду имею именно возвращение значения вместо out. Исключения это и есть самый нормальный способ работы и некошерными ситуациями. Дрочить возвращаемые значения функций -- это уровень C и засорение исходников ненужными техническими подробностями.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]hex_laden
2014-04-12 00:44 (ссылка)
1. Да, тормозит и да, есть вариант хранить отрезки по-другому.
В структуре с полями
Стартовое_значение - long
Конечное_значение - long
Не_закрыто - bool
Если число одно - это отрезок с это число по это же. Если отрезок с-по, то так и хранить, если отрезок с одного конца пуст - ставить 0 и хранить булево значение в поле рядом.
Такой способ хранения информации решает автоматом 2 и оптимизирует 3. (придется правда добавить кода в поиск min/max и еще кое-где). Но проблема с повторами возникает и с ToArray()

(Ответить) (Уровень выше)


[info]hex_laden
2014-04-12 00:48 (ссылка)
про 3 я че-то оговорился. отвлекся - такой способ хранения оптимизирует 1, конечно же
а 3 да, надо в любом случае переделать.
Благодарю за реакцию, кстати :)

(Ответить) (Уровень выше)