我創建了自己的迭代器(第一次),以便轉換通用列表的內容。它看起來像這樣:迭代器拋出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.Dictionary2.get_Item(TKey key)
$ 1.VB StateMachine_0_ConvertList.MoveNext()中d:\工作區\ MyClass.vb:線203
at MyClass
在System.Collections.Generic.List1..ctor(IEnumerable
1集合)
在System.Linq.Enumerable.ToList [TSource](的IEnumerable1 source)
1.SomeFunction(爲MyObject x)的在d:\工作區\ MyClass.vb:線162
at MyClass
好了,所以異常使得現在略微更有意義。我想這確實是一個內部表示,但我真的不明白爲什麼會這樣。它確實在下一步失敗。有沒有一種方法可以調試並查看它提取的密鑰類型?或者這個內部字典是什麼樣的?
代碼片段相當不足。這個迭代器如何被使用也很重要,Linq擴展方法可以使用字典。至少發佈使用迭代器的代碼和異常的堆棧跟蹤。 –
你說得對。我提供了調用堆棧的相關部分和調用代碼行。謝謝你看看。 – Martao
發佈* complete *調用堆棧,我們需要看到ConvertList上面的幀。必要時禁用我的代碼。 –