[英]List<T>.Remove(T item) removing item from original List
我有以下代码
foreach (var d in dots)
{
var _tempPointList = new List<Point>();
_tempPointList = _pointList;
foreach (var point in _tempPointList)
{
if (d >= point.X && d <= point.Y)
{
_tempPointList.Remove(point);
}
}
}
因此,当整数d
在点类型的X
和Y
之间时,它将被从临时列表中删除,因为下一个d
不必检查相同的_tempPointList
元素。 但是当代码到达_tempPointList.Remove(point);
point元素已从_tempPointList
和_pointList
,我感到很奇怪。 为什么还要从主列表中删除呢?
因为您正在使用相同的列表。 您实际上是在此行中为_tempPointList
分配了相同的实例(并删除了在上一行中创建的原始_tempPointList
的引用。):
_tempPointList = _pointList;
我建议您通过使用此调用直接复制列表来实例化副本列表:
var _tempPointList = new List<Point>(_pointList); //creates a shallow copy
我看到了另一个问题:您正在遍历列表时从列表中删除元素。 继续进行迭代时,是否没有收到System.InvalidOperationException
?
我可以通过遍历原始列表并从副本列表中删除来解决此问题,如下所示:
foreach (var d in dots)
{
var _tempPointList = new List<Point>(_pointList);
foreach (var point in _pointList)
{
if (d >= point.X && d <= point.Y)
{
_tempPointList.Remove(point);
}
}
_pointList = _tempPointList;
}
正如您的问题评论中提到的endend一样,您可以仅在List.RemoveAll()上使用谓词,如果谓词返回true,则该谓词将删除项目。 我没有测试性能,但可以自由比较。
foreach (var d in dots)
{
_pointList.RemoveAll(point => d >= point.X && d <= point.Y);
}
您将需要复制列表以使逻辑起作用。
// instead of this
var _tempPointList = new List<Point>();
// make a copy like this
var _tempPointList = new List<Point>(_pointList);
否则,您刚刚复制了对列表的引用,并且_tempPointList
和_pointList
指向同一内存
您遇到此问题是因为_tempPointList和_pointList具有相同的引用,因此,当您修改一个列表时,另一个列表会被自动修改。 您遇到的另一个问题是Foreach,在使用Foreach遍历列表时,无法简化列表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.