.NET условный обратный вызов по типу - PullRequest
0 голосов
/ 14 февраля 2011

У меня есть цена акций, которая постоянно меняется от природы. И будет много пользователей, которые захотят купить эту акцию.

Скажем, цена на акцию начинается с 10, скажем, 30 человек предлагают 10,98, 20 - 7,45, 100 - 8,99.

В течение дня цена акций может касаться любого из этих значений, и если это произойдет, я хочу выполнить все заказы для пользователей, которые указали эту цену.

Технически, я храню в Списке. Всякий раз, когда цена изменяется, я проверяю все значения в списке и выполняю те, которые соответствуют заявленной цене.


Class Bids
{
  string stockname;
  double quote;
}

Есть ли лучший альтернативный способ отозвать удовлетворенные элементы в списке вместо проверки всех элементов при каждом изменении ??

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

Ответы [ 2 ]

1 голос
/ 14 февраля 2011

То, что вы действительно хотите, это способ быстро определить, требует ли движение цены акций выполнения ордеров на покупку.Как правило, ордер на покупку исполняется, если цена составляет по цене или ниже указанной цены.Поэтому, если кто-то предложит 10 долларов, а последняя заявленная цена - 8,99 доллара, вы должны выполнить этот заказ.Покупатель получает свои акции по цене 8,99 долл. Вместо 10 долл.

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

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

Вы можете сделать это с List<T>, хотя вам придется пересортировать список всякий раз, когда вы добавляете что-то,и удаление элементов из списка несколько неэффективно, потому что другие элементы должны перемещаться вверх, чтобы заполнить отверстия, оставленные удаленными элементами.

Пространство имен System.Collections.Generic имеет ряд отсортированных типов коллекций, которые позволяют вам делатьэто, но ни один из них не принимает несколько элементов с одинаковым ключом.Таким образом, ваш ключ может быть не просто ценой на акции, но должен быть ключом, состоящим из нескольких частей, который включает цену на акции и что-то еще.Тем не менее, было бы не очень сложно создать тип ключа и функцию сравнения, которая позволила бы вам упорядочить вещи, чтобы вы могли быстро вставлять, удалять и искать.

Или вы можете создать min heap , что позволяет быстро вставлять предметы и находить самый дешевый заказ на покупку.Поиск и удаление предмета, который не является самым дешевым, более сложен и столь же неэффективен, как и использование списка.

Реальный вопрос, который вам нужно задать себе, - достаточно ли List для ваших целей.Сколько предметов в списке?Как часто вы добавляете или удаляете предметы?Как часто вы должны проверять, должны ли быть выполнены ордера на покупку?Если у вас есть только несколько элементов, которые вы проверяете раз в минуту, то последовательный список будет работать нормально, и нет причин тратить усилия на его улучшение.Если у вас есть 10 000 отложенных ордеров, и вы должны проверять их каждую секунду (или несколько раз в секунду), при этом ордера поступают постоянно, тогда вам понадобится гораздо более сложный план, который включает упорядоченную структуру данных, которая позволяет быстро искатьи обновите.

1 голос
/ 14 февраля 2011

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

...