2013-10-19 62 views
0

我創建了自己的迭代器(第一次),以便轉換通用列表的內容。它看起來像這樣:迭代器拋出KeyNotFoundException

Private Iterator Function ConvertList(x As MyObject, something) As IEnumerable(Of MyObject) 
    For Each item As MyObject In Me.MyObjectList 
     If(item.Equals(x)) Then 
     Continue For 'Dont need this object 
     ElseIf(some condition) 
     Yield item 
     Else 
     Yield DoSomeTransformations(item) 
     End If 
    Next Item 
End Function 

現在,當我執行它與3項的列表(作者爲MyObject)會發生什麼:它採用的第一元素,如預期進入yield語句。然後,而不是去第二個元素,它會在「Next item」語句(「給定的鍵不存在於字典中」)上引發KeyNotFoundException。

這使我困惑。我確實使用了一些字典,但這裏的集合是一個List(Of T)。因此,我認爲它必須是一些內部表示。如果我沒有記錯,List(Of T)實現IEnumerable(Of T),所以For Each應該可以吧?儘管如此,我試圖通過使用AsEnumerable()來解決,以及嘗試一個正常的For循環,而不是ForEach。兩者似乎都沒有幫助。現在,我有種想法。

任何人都可以給我線索嗎?

編輯: 調用代碼是很簡單:

Dim newList As List(Of MyObject) = ConvertList(...).ToList() 

調用堆棧:

Mydll!MyClass.ConvertList() Line 203 Basic 
mscorlib.dll!System.Collections.Generic.List<MyObject>.List(System.Collections.Generic.IEnumerable<MyObject> collection) + 0x34f bytes 
System.Core.dll!System.Linq.Enumerable.ToList<MyObject>(System.Collections.Generic.IEnumerable<MyObject> source) + 0x86 bytes 
Mydll!MyClass.SomeFunction(MyObject x) Line 162 + 0x28 bytes Basic 

堆棧跟蹤:

在System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary 2.get_Item(TKey key)
at MyClass
$ 1.VB StateMachine_0_ConvertList.MoveNext()中d:\工作區\ MyClass.vb:線203
在System.Collections.Generic.List 1..ctor(IEnumerable 1集合)
在System.Linq.Enumerable.ToList [TSource](的IEnumerable 1 source)
at MyClass
1.SomeFunction(爲MyObject x)的在d:\工作區\ MyClass.vb:線162

好了,所以異常使得現在略微更有意義。我想這確實是一個內部表示,但我真的不明白爲什麼會這樣。它確實在下一步失敗。有沒有一種方法可以調試並查看它提取的密鑰類型?或者這個內部字典是什麼樣的?

+0

代碼片段相當不足。這個迭代器如何被使用也很重要,Linq擴展方法可以使用字典。至少發佈使用迭代器的代碼和異常的堆棧跟蹤。 –

+0

你說得對。我提供了調用堆棧的相關部分和調用代碼行。謝謝你看看。 – Martao

+0

發佈* complete *調用堆棧,我們需要看到ConvertList上面的幀。必要時禁用我的代碼。 –

回答

0

與別人我設法找到了,其實錯誤沒有在似乎要發生的位置發生的幫助。實際上,這個異常是在轉換完成的部分拋出的,並且可能被迭代器實現中的try-block捕獲。

我認爲吸取的教訓是:永遠不要相信異常的位置。當調試器中斷時更改設置幫助了我。 (Visual Studio中的Alt-Ctrl-E)

0

我認爲你缺少一個支架

If(item.Equals(x)) Then 
+0

對於錯字,我很抱歉。但這顯然不是答案。我只是手動鍵入,所以我可以刪除實現細節... – Martao

相關問題