猿问

如何在遍历泛型列表时从泛型列表中删除元素?

如何在遍历泛型列表时从泛型列表中删除元素?

我在找一个更好的花纹为了处理每个需要处理的元素列表,然后根据结果从列表中删除。

你不能用.Remove(element)在一个foreach (var element in X)(因为它会导致Collection was modified; enumeration operation may not execute.例外).。你也不能用for (int i = 0; i < elements.Count(); i++).RemoveAt(i)因为它会破坏集合中当前相对于i.

有什么好办法吗?


holdtom
浏览 721回答 3
3回答

慕虎7371278

用for循环反向迭代列表:for&nbsp;(int&nbsp;i&nbsp;=&nbsp;safePendingList.Count&nbsp;-&nbsp;1;&nbsp;i&nbsp;>=&nbsp;0;&nbsp;i--){ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;some&nbsp;code &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;safePendingList.RemoveAt(i);}例子:var&nbsp;list&nbsp;=&nbsp;new&nbsp;List<int>(Enumerable.Range(1,&nbsp;10));for&nbsp;(int&nbsp;i&nbsp;=&nbsp;list.Count&nbsp;-&nbsp;1;&nbsp;i&nbsp;>=&nbsp;0;&nbsp;i--){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(list[i]&nbsp;>&nbsp;5) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.RemoveAt(i);}list.ForEach(i&nbsp;=>&nbsp;Console.WriteLine(i));或者,您可以使用RemoveAll方法带有要对以下内容进行测试的谓词:safePendingList.RemoveAll(item&nbsp;=>&nbsp;item.Value&nbsp;==&nbsp;someValue);下面是一个简化的示例来演示:var&nbsp;list&nbsp;=&nbsp;new&nbsp;List<int>(Enumerable.Range(1,&nbsp;10));Console.WriteLine("Before:");list.ForEach(i&nbsp;=>&nbsp;Console.WriteLine(i)); list.RemoveAll(i&nbsp;=>&nbsp;i&nbsp;>&nbsp;5);Console.WriteLine("After:");list.ForEach(i&nbsp;=>&nbsp;Console.WriteLine(i));

浮云间

一个简单明了的解决方案:使用标准的循环运行。倒着在你的收藏品上RemoveAt(i)删除元素。

慕斯王

当您想要在对集合进行迭代时从集合中删除元素时,首先要想到的是反向迭代。幸运的是,有一个比编写一个for循环更优雅的解决方案,它涉及不必要的输入,并且可能容易出错。ICollection<int>&nbsp;test&nbsp;=&nbsp;new&nbsp;List<int>(new&nbsp;int[]&nbsp;{1,&nbsp;2,&nbsp;3,&nbsp;4,&nbsp;5,&nbsp;6,&nbsp;7,&nbsp;8,&nbsp;9,&nbsp;10});foreach&nbsp;(int&nbsp;myInt&nbsp;in&nbsp;test.Reverse<int>()){ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(myInt&nbsp;%&nbsp;2&nbsp;==&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test.Remove(myInt); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP
我要回答