Конкатенация двух массивов приводит к двум модифицированным массивам вместо одного C# - PullRequest
0 голосов
/ 18 января 2020

У меня очень странное поведение при объединении двух массивов:

Допущения

У меня есть класс 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() Я также вижу изменения значений:
enter image description here

1 Ответ

0 голосов
/ 18 января 2020

Проблема заключается прямо здесь:

Minutes30.Add(M6t);

Это добавляет ссылку на класс Tensor M6t к минутам 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...