迭代器抛出KeyNotFoundException

时间:2013-10-19 08:47:15

标签: vb.net iterator ienumerable

我创建了自己的迭代器(第一个),以便转换通用列表的内容。它看起来像这样:

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个项目的List(Of MyObject)上执行它时会发生什么:它需要第一个元素,按照预期转到yield语句。然后,它不会转到第二个元素,而是在“下一个项目”语句上抛出一个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:\ Workspace \ MyClass.vb:第203行
  在System.Collections.Generic.List 1..ctor(IEnumerable 1集合)
  at System.Linq.Enumerable.ToList [TSource](IEnumerable 1 source)
at MyClass
1.SomeFunction(MyObject x)在D:\ Workspace \ MyClass.vb:第162行

好的,所以异常现在更有意义了。我想它确实是一个内部表示,虽然我不知道为什么使用它。它确实在移动中失败了。有没有办法可以调试,看看它取出了什么样的密钥?或者这个内部字典是什么样的?

2 个答案:

答案 0 :(得分:0)

我认为你错过了一个支架

 If(item.Equals(x)) Then

答案 1 :(得分:0)

在别人的帮助下,我设法发现错误实际上并没有发生在它似乎发生的位置。实际上,异常是在转换完成的部分抛出的,并且可能在迭代器实现中被try-block捕获。

我认为吸取的教训是:永远不要相信例外的位置。调试器中断时更改设置有助于我。 (Visual Studio中的Alt-Ctrl-E)