8

私のアプリケーションの要件は次のとおりです。次のような注文を保存する必要があります。

  • 各注文は特定のストックコード(文字列)に関連し、価格、ボリューム、およびそれに関連付けられた購入または販売(ブール)かどうかがあります。

  • 特定の在庫に関連するすべての注文に対していくつかの操作を実行する必要があります。たとえば、在庫コード「abc」の注文量の合計を取得します。

  • データ構造に注文を追加できるようにする必要があります

  • データ構造から注文を削除できるようにする必要があります

  • 注文が追加または削除された後、どの注文が最良の価格を提供しているかを見つけることができる必要があります。

これが私がこれまで考えていることです:

public class Order : IComparable
{

   private string _StockCode;
   private bool _BidSide;
   private int _Volume;
   private decimal _Price;
   private int _ExchangeOrderId;

   public int CompareTo(Order other)
   {
        if (_BidSide != other.BidSide)
        {
            return _BidSide ? 1 : -1;
        }
        return decimal.Compare(_Price, other.Price);
   }
}

次に、注文をDictionary <string、List<Order>>に保存します。各株式コードは、その株式の注文リストを指す辞書のキーになります。また、注文IDを証券コードに一致させる辞書を維持します。

  • 新しい注文を追加するには、現在の銘柄コードに基づいて辞書で適切な注文リストを見つけ、注文を挿入します。また、現在の注文と適切なリストを一致させるエントリをorderstockディクショナリに追加します。

  • 最良の価格を見つけるために、辞書で現在の銘柄コードの注文リストを検索し、リストを並べ替えて、最高の注文を印刷します。

  • 削除には注意が必要です。まず、銘柄コードで適切なリストを検索する必要があります。次に、その銘柄コードのすべての注文を繰り返し処理し、現在の注文IDに一致する注文を見つけて削除する必要があります。現在の銘柄コードの注文が多い場合、これは明らかに非効率的です。これは、この情報を保存するための最良の方法ですか?

4

3 に答える 3

1

大量のデータを使用してこれを行う場合は、データベースに入れてください。これはクラスでやりたいことではありません。

ただし、少量のデータセットを使用している場合は、LINQを使用してコードでこれを行うことができます。

IEnumerableOrderを実装してから、を使用しList<Order>て注文を保存する必要があると思います。StockCodeにパブリックプロパティを作成すると、 LinqOrderを使用して注文を取得できます。

List<Order> orders = GetOrderList();

var ibmOrders = from o in orders
    where o.StockCode == "IBM"
    select o;

リストからアイテムを削除するのは非常に簡単です。

List<Order> orders = GetOrderList();

var orderToRemove = (from o in orders
  where o.ExchangeId == 1315
  select o).FirstOrDefault();

if (orderToRemove != null) {
    orders.Remove(orderToRemove);
}

Linqを使用して最良の価格で検索するのは非常に便利です。

Order bestPricedOrder = (from o in orders 
        orderby Price 
        select o).FirstOrDefault(); 

より優れたLINQトリックについては、101LINQサンプルを参照してください。

于 2012-04-13T23:27:18.073 に答える
1

キー=orderid、value =株式コードの初期辞書のリストにある注文への参照で構成される、追加の辞書を追加します。

これはインデックスのように機能し、一定時間の削除を提供します。注文IDが異なると仮定すると、1:1でマップされます。必ず両方の辞書から削除してください。

コメントで示唆されているように、私はあなたが証券コードでアクセスする必要がある計算された合計の追加の辞書をお勧めします。これは、一定時間のアクセスとメモリのトレードオフです。記憶が問題でない限り、これはあなたがそれを必要とするたびにそれを計算するのに好ましいように思われるでしょう。新しい注文を受け取った場合は、合計や平均などを更新できます。並行して作業を行っている場合は、問題が発生しないようにロックが必要になることに注意してください。

于 2012-04-13T23:47:31.453 に答える
0

私は、データベースが最良の選択肢であるというコメントに同意します。それらはこのタイプのもののために設計されています。

このデータをメモリに保持する必要があり、コードごとに実際に多くの注文がある場合は、を使用しDictionary<string, SortedSet<Order>>ます。SortedSetを使用すると、最小/最大を簡単に見つけることができ、挿入/削除をすばやく行うことができます。

于 2012-04-13T23:30:38.880 に答える