当我迭代count时,我的数组改变了大小,为什么?

本文关键字:为什么 改变 我的 迭代 count 数组 | 更新日期: 2023-09-27 18:01:17

当我运行一个简单的代码来设计训练和测试数据交叉验证时,我遍历列表的每个计数,但每次迭代列表都会减少1。

for (var i = 0; i < adjustedData.Count; i++)
        {
            var tempData = adjustedData;
            var testData = tempData[i].ToArray();
            var trainDataList = tempData;
            trainDataList.RemoveAt(i);
            var trainData = trainDataList.ToArray();

当我迭代count时,我的数组改变了大小,为什么?

这难道不是因为你的代码正在从数组/列表中删除项目吗?以下代码行

       trainDataList.RemoveAt(i);

调用trainDataList.RemoveAt(i);时,您正在删除数组中的一个元素。这与清除值不同:trainDataList[i] = null;;

让我们使用一个现实世界的例子。想象一下,数组是一系列在桌子上排列的杯子。当你呼叫trainDataList.RemoveAt(i);时,你正在移除其中一个杯子。当你叫trainDataList[i] = null;时,你把杯子留在那里,只是把里面的东西倒出来。

因为你要删除一个项目,你的数组大小改变了

trainDataList.RemoveAt(i);

分配:

var tempData = adjustedData;
// ...
var trainDataList = tempData;

不会克隆您的列表。他们只会复制参考文献。因此,您将有三个引用相同的列表。

你可以创建一个(浅)克隆:

var tempData = adjustedData.ToList(); // using Linq

在克隆上调用.RemoveAt不会影响原始的,因为这次您有对不同列表实例的引用。