在Visual Basic中,For Each循环用于顺序遍历集合或数组中的所有元素。它的使用简化了对可枚举对象(如Collection、Array、列表等)的操作,无需显式访问索引。
语法:
For Each element As DataType In collection ' 对element的操作 Next
与其他循环的区别:
For — 需要指定计数器和范围,适用于需要按索引访问元素的情况。While — 当条件为真时执行,适用于不确定的迭代次数。For Each — 无需访问索引遍历所有元素,适合现代集合。For Each的限制和特点:
示例:
Dim items As New List(Of Integer)({1, 2, 3}) For Each item As Integer In items Console.WriteLine(item) Next
尝试在循环中修改集合可能会引发错误:
For Each item As Integer In items If item = 2 Then items.Remove(item) ' 异常! End If Next
如果元素是结构体,使用For Each是否可以按值修改集合中的元素?
不可以,如果集合的元素是结构体(值类型),则For Each中的迭代变量包含值的副本。对变量的任何修改不会影响集合中的实际元素。例如:
Structure Point Public X As Integer End Structure Dim points As New List(Of Point)({New Point With {.X = 1}}) For Each pt In points pt.X = 100 ' 不会改变points(0).X Next
故事
在项目中使用For Each来修改员工结构的字段。迭代并未更改原始数据,因为迭代对象是副本,而不是集合的实际元素。由于此原因,工资更新未能生效。
故事
在For Each中遍历列表时在条件内删除元素 — 结果应用程序抛出InvalidOperationException并意外终止。
故事
在未考虑集合的可变性情况下,通过For Each遍历集合导致无限循环,因为外部数据源在读取的同时填充该集合,导致计算中的逻辑错误。