C#在foreach遍历删除集合中元素的三种实现方法
前言
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。
集合已修改;可能无法执行枚举操作。
方法一:采用for循环,并且从尾到头遍历
如果从头到尾正序遍历删除的话,有些符合删除条件的元素会成为漏网之鱼;
正序删除举例:
ListtempList=newList (){"a","b","b","c"}; for(inti=0;i { Console.Write(p+","); });
控制台输出结果:a,b,b,c
有两个2没有删除掉;
这是因为当i=1时,满足条件执行删除操作,会移除第一个b,接着第二个b会前移到第一个b的位置,即游标1对应的是第二个b。
接着遍历i=2,也就跳过第二个b。
用for倒序遍历删除,从尾到头
ListtempList=newList (){"a","b","b","c"}; for(inti=tempList.Count-1;i>=0;i--) { if(tempList[i]=="b") { tempList.Remove(tempList[i]); } } tempList.ForEach(p=>{ Console.Write(p+","); });
控制台输出结果:a,c,
这次删除了所有的b;
方法二:使用递归
使用递归,每次删除以后都从新foreach,就不存在这个问题了;
staticvoidMain(string[]args) { ListtempList=newList (){"a","b","b","c"}; RemoveTest(tempList); tempList.ForEach(p=>{ Console.Write(p+","); }); } staticvoidRemoveTest(List list) { foreach(variteminlist) { if(item=="b") { list.Remove(item); RemoveTest(list); return; } } }
控制台输出结果:a,c,
正确,但是每次都要封装函数,通用性不强;
方法三:通过泛型类实现IEnumerator
staticvoidMain(string[]args) { RemoveClasstempList=newRemoveClass (); tempList.Add(newGroup(){id=1,name="Group1"}); tempList.Add(newGroup(){id=2,name="Group2"}); tempList.Add(newGroup(){id=2,name="Group2"}); tempList.Add(newGroup(){id=3,name="Group3"}); foreach(GroupitemintempList) { if(item.id==2) { tempList.Remove(item); } } foreach(GroupitemintempList) { Console.Write(item.id+","); } //控制台输出结果:1,3
publicclassRemoveClass{ RemoveClassCollection collection=newRemoveClassCollection (); publicIEnumeratorGetEnumerator() { returncollection; } publicvoidRemove(Tt) { collection.Remove(t); } publicvoidAdd(Tt) { collection.Add(t); } } publicclassRemoveClassCollection :IEnumerator { List list=newList (); publicobjectcurrent=null; Randomrd=newRandom(); publicobjectCurrent { get{returncurrent;} } inticout=0; publicboolMoveNext() { if(icout>=list.Count) { returnfalse; } else { current=list[icout]; icout++; returntrue; } } publicvoidReset() { icout=0; } publicvoidAdd(Tt) { list.Add(t); } publicvoidRemove(Tt) { if(list.Contains(t)) { if(list.IndexOf(t)<=icout) { icout--; } list.Remove(t); } } }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。