VB.NET List(Of T)按索引移除元素时抛出OutOfRangeException问题求解
问题原因
- Append方法误用是核心诱因
List(Of T)的Append是.NET提供的LINQ扩展方法,不会修改原列表对象,只会返回一个包含追加元素的新IEnumerable序列。你调用cc1List.Append(cc1TempObject)后没有将返回值赋值回cc1List,这部分元素根本没有存入你使用的列表对象中,导致列表实际长度远小于你手动维护的CWBListMaxIndex,循环到超过实际长度的索引时就会触发OutOfRangeException。 - 循环上限依赖手动维护变量不可靠
手动维护的CWBListMaxIndex很容易和列表实际长度出现偏差,直接用列表自带的Count属性计算循环上限能完全规避这类问题。
解决方案
最优方案:调用原生删除方法
你不需要自己写循环构建临时列表,List(Of T)自带RemoveAt方法,一行代码即可实现指定索引元素删除:
cc1List.RemoveAt(IndexToRemove)
如果你需要保留自定义循环逻辑的修正写法
Dim cc1ListTemp As New List(Of cc1) ' 直接用列表实际长度计算上限,不要用手动维护的变量 For i = 0 To cc1List.Count - 1 If i <> IndexToRemove Then cc1ListTemp.Add(cc1List(i)) End If Next cc1List = cc1ListTemp
后续添加元素的注意事项
统一用Add方法添加元素即可,Add是List的原生方法,会直接修改原列表内容:
' 正确写法,直接修改原列表 cc1List.Add(cc1TempObject) ' 如果你一定要用Append,必须赋值回原列表才会生效 cc1List = cc1List.Append(cc1TempObject).ToList()
内容的提问来源于stack exchange,提问作者1lsvks5w2l
相关产品推荐
相关产品推荐

