为了转换通用列表的内容,我创建了自己的迭代器(有史以来第一个)。它看起来像这样:
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 1622.get_Item(TKey key)
at MyClass1..ctor(IEnumerable
1 source)
at MyClass
好的,所以这个例外现在更有意义了。我想它确实是一种内部表示,尽管我真的不明白为什么要使用它。它确实在movenext上失败了。有没有办法可以调试并查看它正在获取什么样的密钥?或者这个内部字典是什么样的?