Доступ и копирование значений в объектах вместо доступа к ссылке на объект - PullRequest
0 голосов
/ 21 ноября 2018

Я пытаюсь заполнить очередь скользящих средних, но получаю ту же дату и закрываю все объекты в очереди скользящих средних.Я застрял, как не получить ссылку, указывающую на один и тот же объект, вместо получения текущего значения в объекте и помещения этого значения в очередь.

public class MA
{
    public static Queue<DateClose> MAMethod(Queue<DateClose> queue,
        Deque<DateClose> firstMASample, int period)
    {
        Deque<DateClose> sample = new Deque<DateClose>(firstMASample.ToArray());
        Queue<DateClose> movingAverageQueue = new Queue<DateClose>(queue.Count() + 1);
        // get the last item or initial MA value from the queue
        DateClose mA = sample.RemoveFromBack();
        DateClose dateClose = null;
        decimal sub = 0;
        DateClose add = null;
        //put the initial Ma value on the movingAverageQueue
        movingAverageQueue.Enqueue(mA);
        foreach (DateClose d in queue.ToList())
        {
            dateClose = sample.RemoveFromFront();
            sub = dateClose.Close;
            // subtract previous closing from new current MA
            mA.Close = mA.Close - sub/period;
            // add the new closing to new current MA
            add = d;
            sample.AddToBack(d);
            mA.Close = mA.Close + add.Close/period;
            mA.Date = add.Date;
            movingAverageQueue.Enqueue(mA);
            queue.Dequeue();
        }

        return movingAverageQueue;
    }
}

movingAverageQueue имеет все те же значения Date и Close.

1 Ответ

0 голосов
/ 21 ноября 2018

Я решил это путем доступа по значению, а не по ссылке, создав два новых объекта в цикле for. Это работает!

        public static Deque<DateClose> MAMethod(Queue<DateClose> queue,
        Deque<DateClose> firstMASample, int period)
    {
        Deque<DateClose> sample = new Deque<DateClose>(firstMASample.ToArray());
        Deque<DateClose> movingAverageQueue = new Deque<DateClose>(queue.Count() + 1);
        // get the last item or initial MA value from the queue
        DateClose mA = sample.RemoveFromBack();
        //DateClose dateClose = null;
        decimal sub = 0;
        DateClose add = null;
        //put the initial Ma value on the movingAverageQueue
        movingAverageQueue.AddToBack(mA);
        foreach (DateClose d in queue.ToList())
        {
            // create a new object for add subtraction moving averages           
            DateClose dateClose = new DateClose(sample.RemoveFromFront());
            sub = dateClose.Close;
            // create a new object to place the new moving average on the queue
            DateClose mAQueueValue = new DateClose(movingAverageQueue.Last());
            // subtract previous closing from new current MA

            mAQueueValue.Close = mAQueueValue.Close - sub/period;
            // add the new closing to new current MA
            add = d;
            sample.AddToBack(d);
            mAQueueValue.Close = mAQueueValue.Close + add.Close/period;
            mAQueueValue.Date = add.Date;
            movingAverageQueue.AddToBack(mAQueueValue);
            queue.Dequeue();
        }

        return movingAverageQueue;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...