如何在C#中使用传统foreach循环替换List指定索引的元素?
问题分析与解决
错误原因
- 索引越界:List的索引从0开始,你的集合有3个元素,最大有效索引是2。当
i == totalLenngth(也就是i=3)时,执行mylist.RemoveAt(i),传入的索引3超出了集合的有效范围,直接触发索引越界错误。 - foreach循环中修改集合:foreach依赖集合的枚举器,在遍历过程中对集合进行
RemoveAt或Add操作会导致枚举器失效,即使索引正确,也会抛出InvalidOperationException。
正确实现方式
如果你是想替换最后一个元素为"Val4",根本不需要删除再添加,直接通过索引赋值即可:
List<string> mylist = new List<string>(); mylist.Add("Val1"); mylist.Add("Val2"); mylist.Add("Val3"); // 直接替换最后一个元素 if (mylist.Count > 0) { mylist[mylist.Count - 1] = "Val4"; }
如果确实需要在遍历中修改集合(比如动态调整元素),改用for循环(从后往前遍历避免索引偏移):
List<string> mylist = new List<string>(); mylist.Add("Val1"); mylist.Add("Val2"); mylist.Add("Val3"); // 从后往前遍历,避免删除元素后索引错乱 for (int i = mylist.Count - 1; i >= 0; i--) { if (i == mylist.Count - 1) // 定位最后一个元素 { mylist.RemoveAt(i); mylist.Add("Val4"); } }
额外提示
- List的索引始终从0开始,访问元素时确保索引范围是
0 <= 索引 < mylist.Count。 - 遍历集合时,如果需要修改集合结构(增删元素),优先使用for循环而非foreach。
内容的提问来源于stack exchange,提问作者Muhammad Bilal
相关产品推荐
相关产品推荐

