连接两个数组会生成两个修改后的数组而不是一个 C#

朱利安·贝克托德

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

假设

我有一个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;
}

奇怪的是,AddtensorToElements()我可以看到值也在变化:
在此处输入图片说明

朱利安·贝克托德

问题就在这里:

Minutes30.Add(M6t);

这将 Class Tensor 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());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在C ++中将两个3 x 3数组连接为一个数组

如何在C ++中检查两个数组,一个随机生成和用户输入的数组

如何在一个数组中存储两个整数(C ++)

如何通过 C++ 将一个数组改造成两个更小的数组?

从两个数组和一个计数整数C语言返回一个值

对链接成降序的两个数组进行排序。一个是字符串数组,一个是 int 数组。C++

用C ++连接两个WCHAR_T数组

C-按迭代位置将两个数组合并为一个

C++:将两个数组传递给一个函数,但结果出乎我的意料

使用 C 在两个数组中找到第一个相同的大写字母

使用C#中的一个ForEach语句迭代两个列表或数组

在C中维护一个指向两个相关类型的指针数组

C ++:我有两个数组,其中第一个元素和最后一个元素具有相同的内存地址

在C中将两个二维数组合并为一个一维数组

如何在C#中连接两个数组?

使用空指针(C)连接两个数组

C#连接两个数组的字符串

使用指针连接两个数组(提供 C 代码)

在C#中将两个双锯齿数组合并为一个锯齿数组

比较C中的两个数组

C printf仅应打印一个元素时从数组中打印两个元素

如何使用C在char数组中用另一个char替换两个char?

su -c“ ...”命令似乎如何传递两个命令而不是一个?

在C中将两个整数连接成一个char *

C# - 将两个列表连接成一个配对值列表

C + +两个锁比一个好?

如何在 C 中连接两个动态 int 数组?

一个函数只返回一个索引而不是两个或更多 | C++

在C#中枢轴后如何创建两个暗淡数组