我在下面的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();
}
});
答案 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--;
}
}
试试这段代码。