То, что вы действительно хотите, это способ быстро определить, требует ли движение цены акций выполнения ордеров на покупку.Как правило, ордер на покупку исполняется, если цена составляет по цене или ниже указанной цены.Поэтому, если кто-то предложит 10 долларов, а последняя заявленная цена - 8,99 доллара, вы должны выполнить этот заказ.Покупатель получает свои акции по цене 8,99 долл. Вместо 10 долл.
Если вы не хотите проверять каждый ордер на покупку каждый раз, когда цена акций изменяется, то вам нужно хранить ордера в некоторой сортированной коллекции.Если вы хотите выполнять заказы, когда указанная цена равна точно цене, запрошенной покупателем, вы можете выполнить двоичный поиск в списке, чтобы узнать, есть ли один или несколько заказов по этой точной цене.
Если вы хотите выполнить заказы, используя типичное поведение «по заявленной цене или ниже», тогда все, что вам нужно сделать, это проверить первый элемент в отсортированном списке, чтобы увидеть, находится ли он на заявленном уровне или нижецена, а затем выполнить все заказы в начале списка, которые соответствуют критериям.
Вы можете сделать это с List<T>
, хотя вам придется пересортировать список всякий раз, когда вы добавляете что-то,и удаление элементов из списка несколько неэффективно, потому что другие элементы должны перемещаться вверх, чтобы заполнить отверстия, оставленные удаленными элементами.
Пространство имен System.Collections.Generic
имеет ряд отсортированных типов коллекций, которые позволяют вам делатьэто, но ни один из них не принимает несколько элементов с одинаковым ключом.Таким образом, ваш ключ может быть не просто ценой на акции, но должен быть ключом, состоящим из нескольких частей, который включает цену на акции и что-то еще.Тем не менее, было бы не очень сложно создать тип ключа и функцию сравнения, которая позволила бы вам упорядочить вещи, чтобы вы могли быстро вставлять, удалять и искать.
Или вы можете создать min heap , что позволяет быстро вставлять предметы и находить самый дешевый заказ на покупку.Поиск и удаление предмета, который не является самым дешевым, более сложен и столь же неэффективен, как и использование списка.
Реальный вопрос, который вам нужно задать себе, - достаточно ли List
для ваших целей.Сколько предметов в списке?Как часто вы добавляете или удаляете предметы?Как часто вы должны проверять, должны ли быть выполнены ордера на покупку?Если у вас есть только несколько элементов, которые вы проверяете раз в минуту, то последовательный список будет работать нормально, и нет причин тратить усилия на его улучшение.Если у вас есть 10 000 отложенных ордеров, и вы должны проверять их каждую секунду (или несколько раз в секунду), при этом ордера поступают постоянно, тогда вам понадобится гораздо более сложный план, который включает упорядоченную структуру данных, которая позволяет быстро искатьи обновите.