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转换为 astock并在原始列表中查找它。如果你还需要索引。

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

您可以定义delegate该事件发送源(这基本上是 Microsoft 建议的指南。object sender换句话说,就像委托签名的第一个参数一样)。

在制作(比如说)一个演员并确定一些真实的if/else对象类型之后。

于 2012-06-23T17:38:55.543 回答
0

如果您的基准测试表明您在事件发生时需要索引,您可以将索引作为属性添加到OrderBook,当您将元素添加到列表时,设置此属性。该值将可用于事件处理程序。

假设您将OrderBook对象保存在一个单独List的列表中并且不对原始列表进行任何重新排列,这将起作用。如果您有多个列表,其中每个对象仅存储在其中一个列表中,那么您可以添加一个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 回答