2010-09-21 50 views
2

我有以下方法:.NET的LINQ:检查数组索引和长度EXCEPTION

/// <summary> 
/// Gets the specified side of trades. 
/// </summary> 
/// <param name="tradesDictionary">The trades dictionary.</param> 
/// <param name="side">The side.</param> 
public IEnumerable<TradeRecord> GetTrades(Dictionary<Guid, TradeRecord> tradesDictionary, Side side) 
{ 
    return (from tradeRecord in tradesDictionary.Values.ToList().AsParallel() 
      where (tradeRecord.OrderRecord.PairRecord.Id == _pairId) 
       && (tradeRecord.Side == side.ToString()) 
      orderby tradeRecord.Date, tradeRecord.DateCreated, tradeRecord.Id 
      select tradeRecord); 
} 

这将导致以下异常:

目标数组不够长 复制所有项目在 集合中。检查数组索引和 长度。

字典传入,字号不断增加。我以前没有收到错误,唯一改变的是tradesDictionary中的数据量。

  1. 为什么会发生此异常?
  2. 我如何防止它发生?

回答

3

“的字典传入,在规模不断增加”

你的意思是,当你执行此代码它被修改?这是一个禁忌。我怀疑ToList通话因此而失败。 (ToList()已执行后,该列表应与字典有效分开。)

基本上Dictionary<TKey, TValue>不支持并发读写。您可能需要查看ConcurrentDictionary<,>,它允许您在另一个线程写入时迭代它。

当它全部正常工作时,提高性能的一个建议是:在方法开始时调用side.ToString()一次而不是每次循环迭代。

+0

感谢Jon的建议。我会试试这个。 – c0D3l0g1c 2010-09-21 11:25:04

+0

将我的易失性Dictionary对象更改为ConcurrentDictionary,并且不再接收错误。我在查询开始时也做了你的建议 - 它的确提高了性能,但是可以忽略不计。随着字典的增长,我相信性能增益会变得更加明显。再次感谢! – c0D3l0g1c 2010-09-21 12:38:16