日期:2014-05-20  浏览次数:20786 次

关于while循环的问题
遍历list并删除其中的元素,以前一直用的是复制临时list的方法做的;前两天,在网上看到可以用while循环直接在原list上修改,试了一下,能够实现,突然想到了两个个问题(1个问题50分):


1.还有其他的什么方法实现遍历list的同时删除其中的元素吗
2.为什么使用for或foreach不行,而使用while循环能够实现,这个三个循环语句的本质区别在哪里?


------解决方案--------------------
foreach遍历的过程中集合若发生改变,很可能会导致空引用,这与其内部实现有关系,自己MSDN
while则是每次执行完循环体都会判断条件
for是可以删除的

http://www.cnblogs.com/oyzl5zl/archive/2011/10/22/2215879.html
------解决方案--------------------
list = list.Where(x => !(这里写删除条件)).ToList();
------解决方案--------------------
楼上分析的没错。
其实还可以这样来删:

if (mylist.Count > 0)
{
for (int i = mylist.Count - 1; i > -1; i--)
{
mylist.RemoveAt(i);
}
}
------解决方案--------------------


for循环不可以,原因:当删除其中一个元素时,剩下的元素索引会发上变化,导致出错或删除遗漏。

foreach循环也不可以,原因:forreach循环时,循环体不能发生改变,所以你删除就会出错。

while循环体与list没有直接的关系,所以可以用while删除!


注:以上纯属个人观点,错误或不足之处望谅解。
------解决方案--------------------
所以,如果要用for或者forreach删除,每次让删除第一个元素。
------解决方案--------------------
说实话,lz估计是认为list中保存了对象,觉得复制一遍浪费内存又浪费时间。实际上保存的是对象的引用。所以复制一个list没有什么性能损失。
------解决方案--------------------
for循环可以删除,从最后一个元素开始遍历,如下:

if (mylist.Count > 0)
{
for (int i = mylist.Count - 1; i > -1; i--)
{
mylist.RemoveAt(i);
}
}
------解决方案--------------------
最好不要在循环的时候,对循环数据进行删除操作。如果一定要操作可以用Linq处理,你一边循环一边删除,改变了for或者foreach里面的判断条件(索引),在循环的时候就会出现问题!
------解决方案--------------------
for可以的,foreach因为要取迭代器 所以不能动态删除

------解决方案--------------------
探讨
for循环不可以,原因:当删除其中一个元素时,剩下的元素索引会发上变化,导致出错或删除遗漏。

foreach循环也不可以,原因:forreach循环时,循环体不能发生改变,所以你删除就会出错。

while循环体与list没有直接的关系,所以可以用while删除!


注:以上纯属个人观点,错误或不足之处望谅解。

------解决方案--------------------
参考下迭代器模式吧!
为了更好的遍历集合类,同时又在遍历时隐藏集合类的具体细节,所以人们采用了迭代器模式。
foreach(var 集合的迭代器 in 集合)
迭代器只提供集合的遍历功能 不参与集合的任何操作。
但是for和while 就不一样了 他们操作的是集合类本身 ,所以你可以对其进行操作