.NET LINQ:检查数组索引和长度EXCEPTION

时间:2010-09-21 11:14:17

标签: .net linq

我有以下方法:

/// <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. 我如何防止它发生?

1 个答案:

答案 0 :(得分:3)

  

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

你的意思是在你执行这段代码时它被修改了吗?这是禁忌。我怀疑ToList电话因此而失败。 (执行ToList()后,列表应与字典有效分开。)

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

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