众所周知,在For Each循环中从IEnumerable
中删除项目是一个非常糟糕的主意。我一直认为IEnumerable
会在你尝试去做时抛出异常。
但是我注意到List
和TreeNodeCollection
行为不一样,即使它们都执行IList
,ICollection
和IEnumerable
。在For Each循环中从其中删除项目时,IEnumerables的行为会有所不同
List
表现得如我所料。下面的代码抛出InvalidOperationException
:
Dim list As New List(Of String)
list.Add("Entry 1")
list.Add("Entry 2")
list.Add("Entry 3")
list.Add("Entry 4")
list.Add("Entry 5")
For Each entry As String In list
list.Remove(entry)
Next
但TreeNodeCollection
不会在.NET 2抛出一个异常,并删除了一些项目,在.NET 4.5.2片断抛出一个NullReferenceException
:
Dim tree As New TreeView
Dim root As TreeNode = tree.Nodes.Add("Root")
root.Nodes.Add("Node 1")
root.Nodes.Add("Node 2")
root.Nodes.Add("Node 3")
root.Nodes.Add("Node 4")
root.Nodes.Add("Node 5")
For Each node As TreeNode In root.Nodes
root.Nodes.Remove(node)
Next
为什么两个IEnumerable
之间会有这种不同的行为?
我觉得你的问题有点奇怪,因为'IEnumerable'接口提供* no *能力来修改正在枚举的东西。因此,当你真正对修改感兴趣时,专注于该界面似乎很奇怪。 –
@Damien_The_Unbeliever我真的不明白为什么它很奇怪。我会很高兴,如果你编辑它更好的措辞 – Breeze
为什么不只是清除() – Paparazzi