List< T>.移除(T项)从原始列表中移除项
本文关键字:列表 原始 移除 List | 更新日期: 2023-09-27 17:50:43
我有以下代码
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);
时,点元素从_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;
}
正如在您的问题的评论中提到的,您可以在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