作者peiga (做自己)
看板C_Sharp
标题Re: [问题]走访阵列或容器时做删除动作
时间Sat Mar 14 21:46:28 2009
※ 引述《CYBASTER (复雠の业火)》之铭言:
: 版上诸位先进高手们好:
: 小弟最近帮人用C#开发一条程式,碰到一个问题,其实从前写C++就已经遇过,
: 那就是在走访循序式容器的途中作删除动作,基本上它让容器变短了,
: 存取的索引值也就跟着乱掉了,
: 比方说10个元素的阵列(for int i=0; i!=arr.Count; i++),索引值从0到9,
: 可是我把索引值6(此时i=6)的元素删掉时,索引值变成0到8,
: 下次再执行i++时,i从6变成7,可是新的索引值7「或许」代表原来的索引值8,
: 也或许整个乱掉了(我没有作仔细的实验),此时怎麽做才是绝对安全的呢?
: (有个笨方法就是弄一个暂存容器把不打算删的通通拷过去,
: 原容器清空後再塞回来,但这实在太…了)
: 以往C++是用STL的erase演算法,
: 它就是透过回传一个新的iterator来重新做正确的衔接,
: 但C#里好像已经没有类似iterator的东西了,不知该怎麽处理呢?
: 请各位先进赐教,感激不尽!
我个人觉得c#的list比array好用,我在此提供list版本的供您参考
//list为List<int>
for(int i = list.count - 1; i >= 0 ;i--)
{
int i = list[i];
if ( condition )
list.remove(i);
}
//版上有推用foreach的,简述一下:
//list如有实作IClone的话可以这样用
foreach(int i in list.Clone())
{
if ( condition)
list.remove(i);
}
小弟资历尚浅,仅提供微薄心得,如有错误,希冀各方前辈提出纠正
谢谢阅读!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.137.134.49
※ 编辑: peiga 来自: 220.137.134.49 (03/14 21:53)
1F:→ CYBASTER:感谢热心解答 <(_ _)> 03/15 19:47
2F:推 tomex:使用阵列倒过来remove就没index的问题了 03/25 08:04