繁体   English   中英

清单 <T> .Remove(T item)从原始列表中删除项目

[英]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在点类型的XY之间时,它将被从临时列表中删除,因为下一个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM