用linq删除所有内部foreach

时间:2013-11-07 22:27:10

标签: c# linq

我明白为什么允许这样做:

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))));

我不明白为什么会失败并且不会删除任何项目。

2 个答案:

答案 0 :(得分:7)

ToList()创建了该集合的副本。因此原件保持不受影响。

要使第二个代码段工作,您需要做的就是删除对ToList()的不必要的调用:

ParalelosSeleccionadosTemp
    .ForEach(p => p.Horarios.ToList()
        .ForEach(q => q.DetallesHorario
            .RemoveAll(x => feriados.Contains(x.Fecha.Value))));

当然DetallesHorario类型为List<T>时,这当然有效。否则,您需要调整此方法以使用适当的方法(或创建一个)来从此集合中删除元素。

请注意,如果HorariosList<T>,则对ToList()的第一次调用也已过时。

答案 1 :(得分:0)

.ToList()会创建一个新列表并对其进行修改,因此您的列表不会更新。

执行此操作的方法是第一个选项,或删除.ToList()