0

私はそのようなクラスを持っています(起こりうる間違いについて申し訳ありませんが、ここに書いています)。この例ではクラスが単純化されています。もちろん、もっと複雑でなければなりません。

class SP500Index {

    SP500Index(List<OrderBook> stocks) {
        foreach (var stock in stocks) {
            stock.StockUpdated += stockUpdated; // how to handle?
        }
    }

}

だから私はたくさんのソースを持っていて、それらからStockUpdatedイベントを処理する必要があります。ハンドラーでは、イベントを発生させたリストindexの在庫を知る必要があります。stocksどうやってするか?

パフォーマンス上の理由からupd「送信者ルックアップ」は必要ありません。代わりにインデックスが必要です。ルックアップは簡単な操作ではなく、Hashcode計算Equalsメソッドの呼び出しなどが含まれる可能性があります。その後、SP500インデックスがどのように変化するか想像してみてください...

4

4 に答える 4

2

フォームの署名を使用することをお勧めします。

public delegate void CustomEventHandler(object sender, CustomEventArgs a);

イベントハンドラーではsender、どのオブジェクトがイベントを発生させたかを調べるために使用できます。

パラメータがない場合、senderどのオブジェクトがイベントを発生させたかを見つけるための(合理的な)方法はないと思います。

関連している

于 2012-06-23T17:39:05.623 に答える
2

これは自動的には提供されません。

ただし、StockUpdatedイベントは次のようになります。

 void StockUpdated (object sender, MyEventArgs e) 

にキャストsenderしてstock、元のリストで検索できます。それでもインデックスが必要な場合。

 void stockUpdated (object sender, MyEventArgs e) 
 {
    OrderBook stock = (OrderBook) sender;
    ....
 }
于 2012-06-23T17:39:55.543 に答える
0

イベントが発生したときにインデックスが必要であることがベンチマークで示されている場合は、インデックスをプロパティとして追加できOrderBookます。リストに要素を追加するときに、このプロパティを設定します。この値は、イベントハンドラーで使用できます。

OrderBookこれは、オブジェクトを1つListにまとめ、この元のリストの再配置を行わないことを前提として機能します。複数のリストがあり、各オブジェクトがそれらのリストの1つだけに格納されOwnerている場合は、格納されているリストを参照するプロパティを追加できます。

例えば...

ビルドするときList<OrderBook>

...
OrderBook book = CreateOrderBook(...);
list.Add(book);
book.ListIndex = list.Count - 1;
// Assign Owner here if that is needed.
...

または、インデックスの更新の簿記を管理するリストを管理するためのヘルパーを使用することをお勧めします。

public class OrderBookManager
{
    private List<OrderBook> list = new List<OrderBook>();

    public void Add(OrderBook book)
    {
        list.Add(book);
        book.ListIndex = list.Count - 1;
        // Assign Owner here if that is needed.
    }

    // Make this read-only if you want to ensure the manager controls all updates to the list (better design) but use it this way for higher performance.
    public List<OrderBook> List { get { return list; } }
}

更新されたOrderBook

public class OrderBook
{
    ...

    public int ListIndex { get; set; }
}

次に、このインデックスを使用したサンプルイベントハンドラー:

public void StockUpdated(object sender, MyEventArgs eventArgs)
{
    OrderBook book = (OrderBook) sender;
    //Here use book.ListIndex to access the original list element.
}

そのインデックスを持っている理由は何ですか?必要なものはすべてオブジェクトに含まれている必要があります。これを使用して元のリストを操作する場合(リストからこのアイテムを削除するなど)、以前に保存されたすべてのオブジェクトの保存されたインデックスを再計算するという問題があります。

他のオブジェクトとの並列リストを維持している場合は、おそらく別の設計を検討する必要があります。

于 2012-06-23T18:42:32.017 に答える
0

delegateそのイベント送信ソースを定義できます(これは基本的にMicrosoftが推奨するガイドラインです。object senderつまり、デリゲートの署名の最初のパラメーターのように)。

キャストを作成した後(たとえば)if/else実際のオブジェクトタイプを決定します。

于 2012-06-23T17:38:55.543 に答える