Обсуждение статьи "Рецепты MQL5 - Реализуем ассоциативный массив или словарь для быстрого доступа к данным" - страница 3
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Доброго времени суток! А не подскажете как циклом пройти по всему словарю, удаляя при этом пары по определенному условию, что-то не могу догнать. Вот пример такой задачи.
Хороший вопрос. Сейчас проверил удаление Вашим способом - оно не работает корректно. Буду разбираться.
Хороший вопрос. Сейчас проверил удаление Вашим способом - оно не работает корректно. Буду разбираться.
оно и не должно работать корректно в общем случае.
правильный способ множественного удаления из ассоциативного массива - собрать массив удаляемых ключей, затем удалить по ключу.
оно и не должно работать корректно в общем случае.
правильный способ множественного удаления из ассоциативного массива - собрать массив удаляемых ключей, затем удалить по ключу.
Это понятно, но опять же лишние телодвижения.
Хороший вопрос. Сейчас проверил удаление Вашим способом - оно не работает корректно. Буду разбираться.
Спасибо за отклик!
оно и не должно работать корректно в общем случае.
правильный способ множественного удаления из ассоциативного массива - собрать массив удаляемых ключей, затем удалить по ключу.
Да вот в том-то и дело, что даже такой способ вдруг вызвал странный баг. Там явно ошибка. Буду разбираться в чем дело.
Пока могу посоветовать создать новый словарь, и в него добавлять значения которые не нужно удалять. Затем старый очистить. Это 100% сработает.
Значит так:
1. Обновляем версию Dictionary на ту что прикреплена к этому посту.
2. Запускаем тестовый скрипт по удалению четных элементов.
Удаление нужно делать в два прохода:
По поводу метода DeleteCurrentObject():
Данный метод нужно использовать только совместно с функцией ContainsKey(). Единственная причина по которой он доступен как public это то, что именно в этом кейсе вызов метода позволяет сэкономить время на повторном позиционировании указателя. Т.е. типичный и единственный случай его использования это 1. Проверили есть ли ключ, 2. если есть - удалили его быстро этим методом.
Это понятно, но опять же лишние телодвижения.
Технически возможно однопроходное удаление как Вы ожидаете. Но сложновато будет. Поэтому пока нет, только в два прохода. С точки зрения словаря как распределенной структуры данных, двухпроходное удаление является более канонически правильным решением. Это только на уровне пользователя кажется что удаление идет последовательно, на самом деле все иначе устроено. В плане перфоманса однопроходное удаление не принесет каких-либо бенефитов. В плане удобства - да, это может быть более удобным.
Технически возможно однопроходное удаление как Вы ожидаете. Но сложновато будет. Поэтому пока нет, только в два прохода. С точки зрения словаря как распределенной структуры данных, двухпроходное удаление является более канонически правильным решением. Это только на уровне пользователя кажется что удаление идет последовательно, на самом деле все иначе устроено. В плане перфоманса однопроходное удаление не принесет каких-либо бенефитов. В плане удобства - да, это может быть более удобным.
Спасибо.