如何在使用for-each循环时从类列表中删除项?

时间:2017-03-13 14:47:20

标签: c# list foreach

我在下面的func中调用了具有3到4个列表项的类列表,在foreach循环中我将系统时间与设定时间进行比较,如果系统时间超过它们,我将PIR_ConditionList中的特定列表删除主叫:

PIR_ConditionList.RemoveAll(element => element == Li);

但我得到错误:

  

收藏被修改;枚举操作可能无法执行。删除列表项

我在foreach中扣除它是一个错误,因为你在循环中无法删除项目。是否有另一种方式或解决方案。

Task.Factory.StartNew(() =>
            {
                try
                {
                    while (PIR_ConditionList.Count>0)
                    {

                        foreach (var Li in PIR_ConditionList)
                        {
                            if (Li.dateimePresent < Li.datetimePlusFour)
                            {
                                var dimLevel = Li.dimLevel;
                                AcquisitionLoop.Luminaires.EnqueueCommand(new SetDimLVLNEW(new SetBrightnessNEW(Li.lumId, dimLevel, Li.lumNumId, Li.clusterId)));
                                Li.dateimePresent = DateTime.Now;
                                Thread.Sleep(10000);
                            }
                            else
                            {

                                PIR_ConditionList.RemoveAll(element => element == Li);

                            }
                        }

                    }
                }
                catch (Exception ee)
                {
                    fourMinTimer();
                }
            }); 

2 个答案:

答案 0 :(得分:4)

您可以使用向后for - 循环代替+ List.RemoveAt

for(int i = PIR_ConditionList.Count -1 ; i >= 0; i--)
{
    var Li = PIR_ConditionList[i];
    if (Li.dateimePresent < Li.datetimePlusFour)
    {
        var dimLevel = Li.dimLevel;
        AcquisitionLoop.Luminaires.EnqueueCommand(new SetDimLVLNEW(new SetBrightnessNEW(Li.lumId, dimLevel, Li.lumNumId, Li.clusterId)));
        Li.dateimePresent = DateTime.Now;
        Thread.Sleep(10000);
    }
    else
        PIR_ConditionList.RemoveAt(i);
}

但是由于您使用多个线程,请注意List<T>不是线程安全的。

答案 1 :(得分:1)

您必须使用for循环:

for (var i = 0; i< PIR_ConditionList.Count; i++)
{
    var Li = PIR_ConditionList[0];

    if (Li.dateimePresent < Li.datetimePlusFour)
    {
        var dimLevel = Li.dimLevel;
        AcquisitionLoop.Luminaires.EnqueueCommand(new SetDimLVLNEW(new SetBrightnessNEW(Li.lumId, dimLevel, Li.lumNumId, Li.clusterId)));
        Li.dateimePresent = DateTime.Now;
        Thread.Sleep(10000);
    }
    else
    {
        PIR_ConditionList.RemoveAt(i);

        i--;
    }
}

试试这段代码。