C# 如何处理来自不同来源的事件?

C# 如何处理来自不同来源的事件?,c#,C#,我有这样的类(对于可能出现的错误,我很抱歉,我就在这里写它。)对于这个例子,类是简化的,当然它必须更复杂 class SP500Index { SP500Index(List<OrderBook> stocks) { foreach (var stock in stocks) { stock.StockUpdated += stockUpdated; // how to handle? } } } 类SP5

我有这样的类(对于可能出现的错误,我很抱歉,我就在这里写它。)对于这个例子,类是简化的,当然它必须更复杂

class SP500Index {

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

}
类SP500索引{
SP500指数(上市股票){
foreach(var存量){
stock.StockUpdated+=StockUpdated;//如何处理?
}
}
}
所以我有很多资料来源,我需要从中处理StockUpdate事件。在handler中,我需要知道引发事件的
stocks
列表中的stock的
index
。怎么做


upd出于性能原因,我不希望使用“发件人查找”,而希望使用索引。查找不是简单的操作,可能涉及
Hashcode
计算
Equals
方法调用等。想象一下N SP500索引是如何变化的…

您可以在该事件发送源的
委托中定义(这基本上是Microsoft建议的准则。具有
对象发送者
,换句话说,就像代理签名的第一个参数)


在进行(比如)转换后,在一些
中确定是否/否则
真正的对象类型。

您可以在
中定义该事件发送源的委托
(这基本上是Microsoft建议的准则。拥有
对象发送者
,换句话说,就像委托签名的第一个参数)


在进行(比方说)转换后,在一些
if/else
中确定真实对象类型。

最好使用表单签名:

public delegate void CustomEventHandler(object sender, CustomEventArgs a);
在事件处理程序中,可以使用
sender
查找引发事件的对象

如果您没有
sender
参数,那么我认为没有任何(合理的)方法来找出引发事件的对象

相关的


使用表格签名是一种良好的做法:

public delegate void CustomEventHandler(object sender, CustomEventArgs a);
在事件处理程序中,可以使用
sender
查找引发事件的对象

如果您没有
sender
参数,那么我认为没有任何(合理的)方法来找出引发事件的对象

相关的


这不是自动提供的

但是StockUpdated事件应该是这样的

 void StockUpdated (object sender, MyEventArgs e) 
您可以将
sender
转换为
stock
并在原始列表中查找。如果您仍然需要索引

 void stockUpdated (object sender, MyEventArgs e) 
 {
    OrderBook stock = (OrderBook) sender;
    ....
 }

这不是自动提供的

但是StockUpdated事件应该是这样的

 void StockUpdated (object sender, MyEventArgs e) 
您可以将
sender
转换为
stock
并在原始列表中查找。如果您仍然需要索引

 void stockUpdated (object sender, MyEventArgs e) 
 {
    OrderBook stock = (OrderBook) sender;
    ....
 }

如果基准测试显示在事件发生时需要索引,则可以将索引作为属性添加到
OrderBook
中,并在向列表添加元素时设置此属性。此值将可用于事件处理程序

假设您将
OrderBook
对象保存在一个
列表中,并且不对原始列表进行任何重新排列,则可以这样做。如果您有多个列表,且每个对象仅存储在其中一个列表中,则可以添加一个
所有者
属性,该属性引用存储该对象的列表

例如

构建
列表时

或者更好的方法是,使用帮助器管理关心索引更新簿记的列表:

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; } }
}
然后是使用此索引的示例事件处理程序:

public void StockUpdated(object sender, MyEventArgs eventArgs)
{
    OrderBook book = (OrderBook) sender;
    //Here use book.ListIndex to access the original list element.
}
您使用该索引的原因是什么?您需要的所有内容都应该在对象中。如果您使用该索引来操作原始列表(例如从列表中删除此项),则会出现重新计算以前存储的所有对象的已保存索引的问题


如果你用其他对象来维护一个并行列表,那么你也许应该考虑一个不同的设计。

如果你的基准显示了在事件发生时需要索引,你可以将索引作为属性添加到OrthBoode中,当你把一个元素添加到列表中时,设置这个属性。事件处理程序

假设您将
OrderBook
对象保存在一个
列表中,并且不对原始列表进行任何重新排列,则可以这样做。如果您有多个列表,且每个对象仅存储在其中一个列表中,则可以添加一个
所有者
属性,该属性引用存储该对象的列表

例如

构建
列表时

或者更好的方法是,使用帮助器管理关心索引更新簿记的列表:

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; } }
}
然后是使用此索引的示例事件处理程序:

public void StockUpdated(object sender, MyEventArgs eventArgs)
{
    OrderBook book = (OrderBook) sender;
    //Here use book.ListIndex to access the original list element.
}
您使用该索引的原因是什么?您需要的所有内容都应该在对象中。如果您使用该索引来操作原始列表(例如从列表中删除此项),则会出现重新计算以前存储的所有对象的已保存索引的问题


如果你用其他对象来维护一个并行列表,那么你也许应该考虑一个不同的设计。

vs2010为我生成了这样的代码:<代码>私有EvthDuner-SturudDeDeD()
。绝对没有参数…有人丢了球…你被煮熟了。修复了。是的,我有
发送者
参数。但我想要索引。当然,通过一些技巧,我可以在EventArgs中传递索引…VS2010为我生成了这样的代码:
私有EventHandler StockUpdate()
。绝对没有参数…有人丢了球…你被煮熟了。修复。是的,我有
发送者
参数。但我想有索引。当然有几个技巧,我可以在EventArgs中通过索引…谢谢,两个答案都很好,但我必须选择一个正确的答案。我支持你的答案。谢谢,两个答案都很好,但我有选择一个正确答案。我支持你的答案。@HenkHolterman我只想让事情简单一些。如果我可以避免查找的话