c#锯齿数组总是在其他数组更新时更新

本文关键字:数组 更新 其他 | 更新日期: 2023-09-27 18:13:35

我遇到了一个问题,似乎是在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的第二次迭代时,在填充mytable的同时,burialtable的第一个元素中的每个条目都用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] };

两种方法都有效,我又学到了一些新的东西。感谢那些回复我的人。

c#锯齿数组总是在其他数组更新时更新

这种行为是意料之中的,也是正常的。

添加50个引用到一个名为mytable单个数组。您不断更新单个引用的值,因此最后所有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;
    ...
    ...

数组是引用类型。这意味着如果你创建了一个新数组的引用。

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;