Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#队列值意外更改_C#_Linq - Fatal编程技术网

c#队列值意外更改

c#队列值意外更改,c#,linq,C#,Linq,下面的代码更改放置在队列上的第一个对象的值。这是将第一个对象放入队列的代码: //put the initial Ma value on the movingAverageQueue movingAverageQueue.Enqueue(previousMa) 这行代码更改了我已经放置在队列上的第一个对象 previousMa.Close = previousMa.Close - sub/period; 我在这段代码的逻辑中遗漏了什么 以下是完整的代码: public class MA {

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

//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;
    }
}
在C#中,对象引用是按值传递的,因此您要赋予该对象一个引用。队列中的引用仍然指向相同的内存位置,因此当您更改对象时,您将在退出该对象引用的队列时看到这些更改


“我在这段代码的逻辑中遗漏了什么?”你能告诉我们发生了什么/没有发生什么吗?您希望发生/不希望发生什么?您将
previousMa
分配到一个位置。它被指定为对
firstMaSample
中最后一项的引用(如果有)。您正在一次又一次地将同一引用添加到
movingAverageQueue
。您将得到一个队列,其中队列中的每个项目都是相同的项目。您是否可能需要发现值类型和引用类型之间的差异?或者你忘了在循环中再次分配
previousMa
。我在这里发现了一个惊人的例子,对象引用是通过值传递的。。。也许这不是解释“通过引用传递”和“通过值传递”的最佳方式。我知道一开始听起来有点奇怪,但这与通过引用传递是不同的。我链接的那篇文章有一个方框,说明了这一点。
public class DateClose
{
    public DateTime Date { get; set; }
    public decimal Close { get; set; }
}