0

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

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()
在 System.Collections.Generic.Dictionary 1.VB$StateMachine_0_ConvertList.MoveNext() 在 D:\Workspace\MyClass.vb:line 203 在 System.Collections.Generic.List 1 集合) 在 System .Linq.Enumerable.ToList[TSource](IEnumerable 1.SomeFunction(MyObject x) 在 D:\Workspace\MyClass.vb:line 162 2.get_Item(TKey key)
at MyClass

1..ctor(IEnumerable
1 source)
at MyClass

好的,所以这个例外现在更有意义了。我想它确实是一种内部表示,尽管我真的不明白为什么要使用它。它确实在movenext上失败了。有没有办法可以调试并查看它正在获取什么样的密钥?或者这个内部字典是什么样的?

4

2 回答 2

0

我认为你缺少一个括号

 If(item.Equals(x)) Then
于 2013-10-19T09:20:49.113 回答
0

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

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

于 2013-10-23T15:44:31.403 回答