【问题标题】:C# jagged array always updated when other arrays are updatedC# 锯齿状数组总是在其他数组更新时更新
【发布时间】:2015-12-17 14:28:18
【问题描述】:

我遇到了一个问题,这似乎是在 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 的更新而更新。这是奇怪还是什么?

在我的处理结束时,burialtable 包含 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# arrays json web asp.net-web-api


    【解决方案1】:

    这种行为是正常的。

    您正在向名为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;
    
        ...
        ...
    

    【讨论】:

      【解决方案2】:

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-08
        • 1970-01-01
        • 1970-01-01
        • 2015-09-23
        • 1970-01-01
        • 2011-09-13
        • 2020-04-02
        • 1970-01-01
        相关资源
        最近更新 更多