更改多维数组中的一个属性也会更改其他数组的属性

时间:2019-01-04 12:32:40

标签: c# arrays

我有一个名为stream-transform的多维数组。在某些情况下,此阵列可以包含单个阵列。如果发生这种情况,我必须复制此阵列并再次添加,因此现在必须有2个阵列。然后,我需要更改这些数组的csv-stringify属性。这是我的代码:

const fs = require('fs');
const csv = require('csv');
const path = require('path');
const EOL = require('os').EOL;

FILE = path.join(__dirname, 'IN.csv');
NEW_FILE = path.join(__dirname, 'OUT.csv');

const readStream = fs.createReadStream(FILE);
const writeStream = fs.createWriteStream(NEW_FILE);

const parse = csv.parse();

const transform = csv.transform((row, cb) => {

    row.push('NEW_COL');
    result = row.join(',') + EOL;
    cb(null, result);
});

readStream.pipe(parse).pipe(transform).pipe(writeStream);

为什么不能分别为每个数组分配SensorGetResult属性?

2 个答案:

答案 0 :(得分:1)

SensorGetResult行似乎是引用类型。 所以当你写

var helperArray = sensorGet.SensorGetResult[0];
sensorGet.SensorGetResult.Add(helperArray);

您实际上说过SensorGetResult中的新行将指向与第一个对象相同的对象。 您可以实现以下方法:

public SensorGetResultRow  Clone()
{
    return new SensorGetResultRow (this.field1, this.field2, etc...)
    //or if you use parameterless constructor
    return new SensorGetResultRow ()
    {
        field1 = this.field1
        //etc.
    }
}

并使用它:

var helperArray = sensorGet.SensorGetResult[0].Clone();

答案 1 :(得分:1)

您似乎为helperArray使用了reference type

执行以下代码时:

var helperArray = sensorGet.SensorGetResult[0];
sensorGet.SensorGetResult.Add(helperArray);

实际上发生的是,您将SensorGetResult 的第一个元素作为对象的引用(我相信您打算复制)并将该引用附加到列表中,从而产生一个列表,其中有两个引用指向内存中的同一对象。

如果要它复制对象,则必须自己实现。通常,这意味着创建一个相同类型的新对象并复制所有属性。

var objectToCopy = sensorGet.SensorGetResult[0];
var helperArray = new WhatEverTypeIsYourHelperArray {
    Property1 = objectToCopy.Property1,
    Property2 = objectToCopy.Property2,
    // etc.
};
sensorGet.SensorGetResult.Add(helperArray);

但是您必须知道是否还有任何属性是引用类型,您需要对所有属性进行递归操作。

如果您拥有WhatEverTypeIsYourHelperArray类型,则可以利用Object.MemberwiseClone方法并使自己更容易使用。您可以通过实现如下方法来实现。注意,MemberwiseClone是受保护的方法,因此您的类中需要一个新方法。

public WhatEverTypeIsYourHelperArray Clone() {
    return (WhatEverTypeIsYourHelperArray)this.MemberWiseClone();
}

但是,即使MemberwiseClone()方法也不会为您复制引用类型,而只是将指针复制到对象,这意味着原始和引用类型的所有属性克隆的对象将指向内存中的相同对象。