用for循环进队列,为什么出队列都是一样的值,是不是进队列的值没有修改,只有最后一次的循环值进了队列?
static void Main(string[] args)
{
Queue<int[]> a = new Queue<int[]>();
int[] x={1,1,2};
int[] y = { 0, 0, 0 };
for (int i = 0; i < 10; i++)
{
a.Enqueue(x);
x[0] = i;
x[1] = i;
x[2] = i;
Console.WriteLine(“{0},{1},{2},”, x[0], x[1], x[2]);
}
while(a.Count>0)
{
y = a.Dequeue();
Console.WriteLine(“{0},{1},{2},”,y[0],y[1],y[2]);
static void Main(string[] args)
{
Queue<int[]> a = new Queue<int[]>();
int[] x={1,1,2};
int[] y = { 0, 0, 0 };
for (int i = 0; i < 10; i++)
{
a.Enqueue(x);
x[0] = i;
x[1] = i;
x[2] = i;
Console.WriteLine(“{0},{1},{2},”, x[0], x[1], x[2]);
}
while(a.Count>0)
{
y = a.Dequeue();
Console.WriteLine(“{0},{1},{2},”,y[0],y[1],y[2]);
}
Console.ReadKey();
}
解决方案
5
Queue<int[]> a = new Queue<int[]>(); int[] x={1,1,2}; for (int i = 0; i < 10; i++) { a.Enqueue(x); x=new int[] {i, i, i}; Console.WriteLine("{0},{1},{2},", x[0], x[1], x[2]); }
30
首先要知道,你的队列a中的元素是一个数组
for (int i = 0; i < 10; i++){}
执行1次后,a{{0,0,0}}
执行2次后,a{{1,1,1},{1,1,1}}
执行3次后,a{{2,2,2},{2,2,2},{2,2,2}}
……
执行10此后,全部是9,a{{9,9,9},……,{9,9,9}},而不是你想象的a{{1,1,1},……,{9,9,9}}
原因很简单,数组是引用类型,a里严格讲是存储了数组x相同的引用(数值的地址),a中一个元素的值改变,全变了
按照你的思路,应该这样改:
for (int i = 0; i < 10; i++){}
执行1次后,a{{0,0,0}}
执行2次后,a{{1,1,1},{1,1,1}}
执行3次后,a{{2,2,2},{2,2,2},{2,2,2}}
……
执行10此后,全部是9,a{{9,9,9},……,{9,9,9}},而不是你想象的a{{1,1,1},……,{9,9,9}}
原因很简单,数组是引用类型,a里严格讲是存储了数组x相同的引用(数值的地址),a中一个元素的值改变,全变了
按照你的思路,应该这样改:
Queue<int[]> a = new Queue<int[]>(); int[] x = { 1, 1, 2 }; int[] y = { 0, 0, 0 }; for (int i = 0; i < 10; i++) { //a.Enqueue(new int[] { i, i, i }); a.Enqueue(x); x = new int[3]; //每次循环new下,表示把数值保存到不同地址,这样a中各个元素就互不干扰了 x[0] = i; x[1] = i; x[2] = i; Response.Write(string.Format("{0},{1},{2},", x[0], x[1], x[2])+"<br />"); } while (a.Count > 0) { y = a.Dequeue(); Response.Write(string.Format("{0},{1},{2},", y[0], y[1], y[2]) + "<br />") ; }
或干脆不用x数组,直接用//a.Enqueue(new int[] { i, i, i })
5
都是一样的值 与队列没有任何关系
数组传递的是引用,并不会原因是是队列而改变
在你没有理解这个基础问题时,你怎么写都是要出问题的
数组传递的是引用,并不会原因是是队列而改变
在你没有理解这个基础问题时,你怎么写都是要出问题的