-1

下面的代码更改放置在队列中的第一个对象的值。这是将第一个对象放入队列的代码:

//put the initial Ma value on the movingAverageQueue
movingAverageQueue.Enqueue(previousMa)

这行代码改变了上面我已经放入队列的第一个对象

previousMa.Close = previousMa.Close - sub/period;

我在这段代码的逻辑中遗漏了什么?

这是完整的代码:

public class MA
{
    public static Queue<DateClose> MAMethod(Queue<DateClose> queue,
        Queue<DateClose> firstMASample, int period)
    {

        Queue<DateClose> sample = new Queue<DateClose>(firstMASample.ToArray());
        Queue<DateClose> movingAverageQueue = new Queue<DateClose>(queue.Count() + 1);
        // get the last item or initial MA value from the queue
        DateClose previousMa = firstMASample.LastOrDefault();
        sample = new Queue<DateClose>(firstMASample.Take(firstMASample.Count - 1));
        DateClose mA = null;
        decimal sub = 0;
        DateClose add = null;
        //put the initial Ma value on the movingAverageQueue
        movingAverageQueue.Enqueue(previousMa);
        foreach (DateClose d in queue.ToList())

        {
            mA = sample.Dequeue();
            sub = mA.Close;
            previousMa.Close = previousMa.Close - sub/period;

            add = d;
            sample.Enqueue(d);
            previousMa.Close = previousMa.Close + add.Close/period;
            previousMa.Date = add.Date;
            movingAverageQueue.Enqueue(previousMa);
            queue.Dequeue();
        }

        return movingAverageQueue;
    }
}

DateClose 类是:

public class DateClose
{
    public DateTime Date { get; set; }
    public decimal Close { get; set; }
}
4

1 回答 1

1

在 C# 中,对象引用是按值传递的,因此您将对该对象的引用加入队列。队列中的引用仍然指向相同的内存位置,因此当您更改对象时,当您将该对象引用出列时,您将看到这些更改。

Jon Skeet 关于 C# 参数传递的文章

于 2018-11-19T21:36:51.390 回答