2014-10-27 152 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