我遇到了一个问题,似乎是处理C#web api程序中锯齿状数组的错误。每次我更新单个维度数组时,它都会更新一个具有相同值的锯齿状数组,即使我没有要求它。更令人费解的是,通过我的单维数组的每次更新迭代,我的锯齿状数组中的所有条目都使用从第一个元素到当前元素的相同数据进行更新。这是我以前从未遇到的事情,非常令人费解。以下是我的代码。
string[][] burialtable = new string[50][]; // the jagged array
string[] mytable = new string[7]; // the single dimension array
int count = 0;
try
{
while (rdr.Read())
{
mytable[0] = rdr.GetString(0);
mytable[1] = rdr.GetString(1);
mytable[2] = rdr.GetString(2);
mytable[3] = rdr.GetString(3);
mytable[4] = rdr.GetString(4);
mytable[5] = rdr.GetString(5);
mytable[6] = rdr.GetString(6);
burialtable[count] = mytable;
count++;
}
rdr.Close();
return burialtable;
第一次通过mytable迭代后,burialtable的第一个元素包含与mytable相同的数据。但是,在调试器中,我注意到当我经历mytable的第二次迭代时,burialtable的第一个元素中的每个条目都在mytable的值被填充的同时更新mytable的值。在mytable的第三次迭代中,burialtable的第一个和第二个元素在更新时与mytable一起更新。这有点奇怪吗?
在我处理结束时,埋葬包含50个相同数据的元素。相同的数据来自最后处理的记录。输出如下:
[["Uphoff","William R.","2/20/1985 ","1985","9 ","87 ","4 "],
["Uphoff","William R.","2/20/1985 ","1985","9 ","87 ","4 "],
["Uphoff","William R.","2/20/1985 ","1985","9 ","87 ","4 "],
["Uphoff","William R.","2/20/1985 ","1985","9 ","87 ","4 "],
["Uphoff","William R.","2/20/1985 ","1985","9 ","87 ","4 "],
["Uphoff","William R.","2/20/1985 ","1985","9 ","87 ","4 "],
我从未遇到过像这样奇怪的编程问题。看来,无论何时更新单维数组,我都会将锯齿状数组中的所有条目更新为当前元素,即使我没有请求它。这是我第一次使用锯齿状数组,所以我必须做错了。我正在尝试在数组中创建一个数组,我可以使用web api以json格式返回为web服务。如果有人知道更好的方法,请告诉我。
感谢你们两位回复的回答。我还提出了另一个对我有用的答案。
burialtable[count] = new string[] { mytable[1], mytable[2], mytable[3], mytable[4], mytable[5], mytable[6] };
这两种方法都有效,我又重新学到了新东西。感谢那些回复的人。
答案 0 :(得分:4)
这种行为是预期和正常的。
您正在为名为mytable
的单数组添加50个引用。您不断更新单个引用的值,因此最后所有50个条目似乎都更新(因为它们......它们都引用了一个数组)。
要修复它,请在循环的每次迭代中创建一个新引用。
string[][] burialtable = new string[50][]; // the jagged array
int count = 0;
try
{
while (rdr.Read())
{
string[] mytable = new string[7];
mytable[0] = rdr.GetString(0);
mytable[1] = rdr.GetString(1);
mytable[2] = rdr.GetString(2);
mytable[3] = rdr.GetString(3);
mytable[4] = rdr.GetString(4);
mytable[5] = rdr.GetString(5);
mytable[6] = rdr.GetString(6);
burialtable[count] = mytable;
count++;
}
rdr.Close();
return burialtable;
...
...
答案 1 :(得分:1)
数组是引用类型。这意味着如果您创建新数组的引用。
string[] mytable = new string[7];
它会保留。所以你可能会认为像这样复制数组
string[] copy = mytable;
但它不是副本。它是一个浅薄的副本。这意味着如果您更改copy
,那么mytable
也会发生变化。因为引用是相同的。
所以你必须这样做
string[][] burialtable = new string[50][]; // the jagged array
int count = 0;
try
{
while (rdr.Read())
{
string[] mytable = new string[7]; // new reference each iteration
mytable[0] = rdr.GetString(0);
mytable[1] = rdr.GetString(1);
mytable[2] = rdr.GetString(2);
mytable[3] = rdr.GetString(3);
mytable[4] = rdr.GetString(4);
mytable[5] = rdr.GetString(5);
mytable[6] = rdr.GetString(6);
burialtable[count] = mytable;
count++;
}
rdr.Close();
return burialtable;