删除我正在预览的集合的元素

时间:2011-08-03 17:31:45

标签: c# foreach

这是一些虚拟代码,说明了我想要做的事情:

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循环?

6 个答案:

答案 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循环并向后移动集合,因此您可以安全地删除项目,因为长度不会受到影响,直到您移动到上一个项目。