我明白为什么允许这样做:
foreach (var paralelos in ParalelosSeleccionadosTemp)
{
foreach (var horario in paralelos.Horarios)
{
for (int i = 0; i < horario.DetallesHorario.Count; i++)
{
if (feriados.Contains(horario.DetallesHorario[i].Fecha.Value))
{
horario.DetallesHorario.RemoveAt(i);
i--;
}
}
}
}
但是这个怎么样?
ParalelosSeleccionadosTemp
.ForEach(p => p.Horarios.ToList()
.ForEach(q => q.DetallesHorario.ToList()
.RemoveAll(x => feriados.Contains(x.Fecha.Value))));
我不明白为什么会失败并且不会删除任何项目。
答案 0 :(得分:7)
ToList()
创建了该集合的副本。因此原件保持不受影响。
要使第二个代码段工作,您需要做的就是删除对ToList()
的不必要的调用:
ParalelosSeleccionadosTemp
.ForEach(p => p.Horarios.ToList()
.ForEach(q => q.DetallesHorario
.RemoveAll(x => feriados.Contains(x.Fecha.Value))));
当然DetallesHorario
类型为List<T>
时,这当然有效。否则,您需要调整此方法以使用适当的方法(或创建一个)来从此集合中删除元素。
请注意,如果Horarios
为List<T>
,则对ToList()
的第一次调用也已过时。
答案 1 :(得分:0)
.ToList()
会创建一个新列表并对其进行修改,因此您的列表不会更新。
执行此操作的方法是第一个选项,或删除.ToList()