当我遍历count时,我的数组会改变大小,为什么?

时间:2016-08-08 18:46:47

标签: c#

当我运行一个旨在进行训练和测试数据交叉验证的简单代码时,我会遍历列表的每个计数,但每次迭代时列表减少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();

4 个答案:

答案 0 :(得分:4)

不应该导致您的代码从数组/列表中删除该项目。以下代码行

       trainDataList.RemoveAt(i);

答案 1 :(得分:2)

当您致电trainDataList.RemoveAt(i);时,您正在移除阵列中的元素。这与清除值不同:trainDataList[i] = null;;

让我们使用一个真实的例子。想象一下,阵列是一系列排列在桌子上的杯子。当您致电trainDataList.RemoveAt(i);时,您需要移除其中一个杯子。当您致电trainDataList[i] = null;时,您将杯子留在那里,但只是将内容丢弃。

答案 2 :(得分:0)

由于您要删除项目,因此数组大小会更改

trainDataList.RemoveAt(i);

答案 3 :(得分:0)

作业:

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

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

您可以使用以下内容制作(浅层)克隆

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

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