2014-10-27 153 views
1

我有一些代码在一本字典和使用简单的LINQ功能找到该词典但是最近我收到以下错误中的一些键值的作品......如何检查字典/集合是否可以迭代?

InvalidOperationException: Operation is not valid due to the current state of the object 
System.Linq.Enumerable.Iterate[KeyValuePair`2,Int32] (IEnumerable`1 source, Int32 initValue, System.Func`3 selector) 

如何确认操作安全地执行,从而避免这个错误?

导致该问题的代码示例...

public void UpdateBounds() 
{ 
    lock (Voxels) 
    { 
      Start = new IntVector3(Voxels.Min(v => v.Key.X), Voxels.Min(v => v.Key.Y), Voxels.Min(v => v.Key.Z)); 
      End = new IntVector3(Voxels.Max(v => v.Key.X), Voxels.Max(v => v.Key.Y), Voxels.Max(v => v.Key.Z)); 
    } 
} 
+2

考虑使用'ConcurrentDictionary'来代替,因为它是线程安全的。好问题,但。 – BradleyDotNET 2014-10-27 18:46:05

+0

我需要性能,在这种情况下,字典包含我快速随机访问的体素信息。按照我的理解,并发字典介绍了开销......我想我可以简单地执行锁定(上下文){访问字典},但这似乎不能解决我的问题。 – War 2014-10-27 18:49:28

+0

如果你需要应用程序的性能(我想用体素,你正在做一些图像处理),我不会使用linq。既不执行6 linq操作查找最小值/最大值。 你应该只使用1循环测试每个值 – hugoterelle 2014-10-27 19:06:34

回答

2

你好像一个空的字典对象上做的操作。

在执行该语句之前检查它是否包含任何内容。 Dictionary.Count是你的家伙。

+0

这将做到这一点...... MSDN似乎同意,如果没有字典中会发生这种情况。 – War 2014-10-27 19:04:46

+0

如果'IEnumerable'为空,Min'和'Max'都会抛出'InvalidOperationException',并显示消息“Sequence contains no elements。”。 – 2014-10-27 20:23:02