如果您的基准测试表明您在事件发生时需要索引,您可以将索引作为属性添加到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.
}
你有这个索引的原因是什么?你需要的一切都应该在对象中。如果您使用它来操作原始列表(例如从列表中删除此项目),那么您将遇到重新计算所有先前存储对象的已保存索引的问题。
如果您要维护与其他对象的并行列表,那么您也许应该考虑不同的设计。