【问题标题】:Concatenating two arrays results in two modified arrays instead of one C#连接两个数组会产生两个修改后的数组,而不是一个 C#
【发布时间】:2020-01-18 00:57:13
【问题描述】:

将两个数组合并在一起时,我有一个非常奇怪的行为:

假设

我有一个类 Tensor,其中包含一个数组 float[] 和一个函数 AddTensorElements:

class Tensor
{
    public float[] MovingAverage3h { get; set; }
    public float[] MovingAverage6h { get; set; }
    public float[] MovingAverage1d { get; set; }
    public void AddTensorElements(Tensor input)
    {
        if (this.MovingAverage3h == null)
        this.MovingAverage3h = input.MovingAverage3h;
        this.MovingAverage6h = input.MovingAverage6h;
        this.MovingAverage1d = input.MovingAverage1d;
        }
        else
       {
       this.MovingAverage3h = Concat(this.MovingAverage3h, input.MovingAverage6h);
       this.MovingAverage6h = Concat(this.MovingAverage6h, input.MovingAverage6h);
       this.MovingAverage1d = Concat(this.MovingAverage1d, input.MovingAverage1d);
       }
    private float[] Concat (float[] first, float[] second)
    {
        List<float> concatenated = new List<float>();
        concatenated.AddRange(first);
        concatenated.AddRange(second);
        //foreach (float value in first) concatenated.Add(value);
        //foreach (float value in second) concatenated.Add(value);
        float[] returnArray = concatenated.ToArray();
        return returnArray;
    }
}

在我的主程序中,我反复将张量 M6t 添加到基本张量 Minutes30[i]

class TensorCreator
{

    private static List<Elements.Tensor> Minutes30 = new List<Elements.Tensor>();

    private static void AddValues(Tensor M6t)
    {
        // Fill Minutes 30
        Minutes30.Add(M6t);
        for (int i = CounterM30; i < Minutes30.Count-1; i += M6)
        {
            { } // Issue come up right here
            Minutes30[i].AddTensorElements(M6t);
            { } // Issue come up right here
        }
    }
    public static void AppendDataToTensor(Elements.Tensor queueElement)
    {
        // ...
        AddValues(M6Avg);
    }
}

预期行为与实际行为

Minutes[i] 中的数组展开
M6t 内的数组保持float[1]

到目前为止一切顺利,这可以在一个单独的小型测试应用程序中使用

在我的实际应用程序中,相同的代码让 baseTensor 扩展,但输入张量也得到扩展!

for (int i = CounterM30; i < Minutes30.Count-1; i += M6)
{
    // M6T.Length == 1;
    Minutes30[i].AddTensorElements(M6t);
    // M6T.Length == Minutes30[i].Length;
}

奇怪的是,whitin AddtensorToElements() 我也可以看到值在变化:

【问题讨论】:

  • List&lt;&gt;.AddRange 会让您的生活更轻松。
  • 同样的结果。正如我所写。
  • 我没有说它会解决你的问题。
  • 你能分享实际的可重现代码吗?我能看懂你的测试代码,但是后面不知道你在说什么。
  • 问题是代码很长,但我会试一试,

标签: c# arrays concatenation


【解决方案1】:

问题就在这里:

Minutes30.Add(M6t);

这会将类张量 M6t 的引用添加到 Minutes 30。结果是 Minutes30[i] 与其自身连接起来。

解决方案: 在 Tensor 类中,添加一个Clone() 方法

public Tensor Clone()
{
    Tensor tensor = new Tensor();
    tensor.MovingAverage3h = this.MovingAverage3h.ToArray();
    tensor.MovingAverage6h = this.MovingAverage6h.ToArray();
    tensor.MovingAverage1d = this.MovingAverage1d.ToArray();
    return tensor;
}

然后改变

    Minutes30.Add(M6t);

    Minutes30.Add(M6t.Clone());

【讨论】:

    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2012-09-29
    • 2021-09-20
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多