【问题标题】:Deleting a line in a list by seleting one point "connected" to it in C#通过在 C# 中选择一个“连接”到它的点来删除列表中的一行
【发布时间】:2016-02-27 23:41:59
【问题描述】:

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

到目前为止,我已经尝试了以下方法:

            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 中

附加信息:收藏已修改;枚举操作 可能无法执行。

【问题讨论】:

  • 因为您使用的是 foreach 循环,所以您无法从当前迭代的内容中删除某些内容。如果您构建了一组需要删除的行,然后在 foreach 循环之外删除它们,它应该可以工作。

标签: c#


【解决方案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 实现枚举集合时修改集合。

【讨论】:

    【解决方案2】:

    您无法从当前正在迭代的列表中删除条目。您可以做的是创建一个新列表,在其中只插入您想要保留的那些条目(例如,您想要删除的所有条目都不会插入到新列表中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2012-01-29
      • 2010-10-27
      相关资源
      最近更新 更多