这是一些虚拟代码,说明了我想要做的事情:
List<int> list1 = new List<int>();
//Code to fill the list
foreach(int number in list1)
{
if(number%5==0)
{
list1.Remove(number);
}
}
假设测试实际上删除了一个int,它将抛出一个错误。有没有办法在foreach中执行此操作,还是必须将其转换为for循环?
答案 0 :(得分:4)
您无法从正在迭代的集合中删除每个项目中的项目。 我会这样做......
list1 = list1.Where(l => l % 5 != 0).ToList();
答案 1 :(得分:2)
我认为RemoveAll()方法最接近你想要的方法:
list1.RemoveAll(i => i%5 == 0);
答案 2 :(得分:1)
实际上,如果你想删除你在O.P中陈述的列表,你可以这样做:
List<int> list1 = new List<int>();
//Code to fill the list
for(var n = 0; n < list.Count; i++)
{
if (list[n] % 5 == 0)
{
list1.Remove(list[n--]);
}
}
已编辑添加
您在每个厕所中无法更改列表的原因如下:
[Serializable()]
public struct Enumerator : IEnumerator<T>, System.Collections.IEnumerator
{
private List<T> list;
private int index;
private int version;
private T current;
internal Enumerator(List<T> list) {
this.list = list;
index = 0;
version = list._version;
current = default(T);
}
public void Dispose() {
}
public bool MoveNext() {
List<T> localList = list;
if (version == localList._version && ((uint)index < (uint)localList._size))
{
current = localList._items[index];
index++;
return true;
}
return MoveNextRare();
}
private bool MoveNextRare()
{
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = list._size + 1;
current = default(T);
return false;
}
public T Current {
get {
return current;
}
}
Object System.Collections.IEnumerator.Current {
get {
if( index == 0 || index == list._size + 1) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumOpCantHappen);
}
return Current;
}
}
void System.Collections.IEnumerator.Reset() {
if (version != list._version) {
ThrowHelper.ThrowInvalidOperationException(ExceptionResource.InvalidOperation_EnumFailedVersion);
}
index = 0;
current = default(T);
}
}
答案 3 :(得分:0)
据我所知,在foreach循环中无法修改集合。您需要将其更改为for循环。另一种方法是使用LINQ。
答案 4 :(得分:0)
你不能使用foreach原地进行,因为它使枚举器无效。
获取列表的副本并对其进行迭代,或者使用不同类型的循环,例如for()循环。
答案 5 :(得分:0)
您无法使用foreach修改您枚举的集合。我经常做的是使用for循环并向后移动集合,因此您可以安全地删除项目,因为长度不会受到影响,直到您移动到上一个项目。