通过在C#中选择“连接”一个点来删除列表中的一行

时间:2016-02-27 15:18:36

标签: c#

我有一个“点/点”列表和一个行列表。当我删除同一个点时,我想删除连接到某个点的所有行。

到现在为止,我已尝试过以下方法:

            foreach (Line g in lines)
                lines.Remove(g.lineContainsPoint(g, selectionPoint));

方法lineContainsPoint:

    public bool lineContainsPoint(Line s, Point c)
    {
        if (s.Source == c || s.Destination == c)
            return true;
        return false;
    }

错误:

  

类型'System.InvalidOperationException'的未处理异常   发生在mscorlib.dll

     

其他信息:收集已修改;枚举操作   可能无法执行。

2 个答案:

答案 0 :(得分:1)

您无法从当前正在迭代的列表中删除条目。您可以执行的操作是创建一个新列表,您只需插入要保留的条目(例如,您要删除的所有条目都不会插入新列表中)。

答案 1 :(得分:1)

您无法在 foreach 循环*中修改集合。您可以过滤要删除的行,然后从行列表中删除它们:

var linesToRemove = lines.Where(g => g.lineContainsPoint(g, selectionPoint)).ToArray();

foreach (Line line in linesToRemove)
                lines.Remove(line); 

或者,使用裸索引而不是foreach迭代列表:

var i = 0;
while(i < lines.Count) {
   if (lines[i].lineContainsPoint(g, selectionPoint))
      lines.RemoveAt(i);
   else
      i++;
}
  • 更具体一点,您不允许在通过IEnumerable实施进行枚举时修改集合。