【问题标题】:DataContract + Multi-dimensional Arrays -- Any solution for this?DataContract + 多维数组——有什么解决方案吗?
【发布时间】:2011-12-17 10:00:37
【问题描述】:

来自MSDN

组合集合类型(具有集合的集合)是 允许。锯齿状数组被视为集合的集合。 不支持多维数组。

那么,如果你不能正常序列化一个多维数组,如何有效地解决这个问题?我的想法是有一个属性来展平数组并序列化该集合并在反序列化期间取消展平它,但我不确定这是否有效?

以前有人找到解决方案吗?


我应该注意,我认为展平可能会起作用的原因是因为我的尺寸是固定值(它们是硬编码的)。

【问题讨论】:

  • 你能指出这些阵列有多大吗?也许你如何/为什么使用它们。

标签: c# serialization multidimensional-array datacontractserializer datacontract


【解决方案1】:

是的,您可以将其展平或锯齿化,无论哪种方式更方便。

【讨论】:

    【解决方案2】:

    任何时候你翻阅一个二维数组,你都在花费 O(n) 的努力(或输入中的每个项目一个“处理”单元)。正如您所说,在 2-D 和 1-D 之间转换并返回并不麻烦。除非您处理的容量非常大(Web 服务调用频率的数组大小),或者在高度受限的系统(.Net Compact 或 .Net Micro Frameworks)上,我怀疑这真的是一个大问题。排序之类的东西会变得很昂贵。

           string[,] input = new string[5, 3];
           string[] output = new string[15];
    
           for (int i = 0; i < input.GetUpperBound(0); i++)
           {
               for (int j = 0; j < input.GetUpperBound(1); j++)
               {
                   output[j * input.GetUpperBound(j) + i] = input[i, j];
               }
           }
    

    【讨论】:

      【解决方案3】:

      也许有一个扩展方法:

      public static string[][] Jaggedize(this string[,] input) {
        string[][] output = new string[input.GetLength(0)][];
        for (int i = 0; i < input.GetLength(0); i++) {
          output[i] = new string[input.GetLength(1)];
          for (int j = 0; j < input.GetLength(1); j++) {
            output[i][j] = input[i, j];
          }
        }
        return output;
      }
      

      【讨论】:

        猜你喜欢
        • 2014-11-14
        • 1970-01-01
        • 2011-08-15
        • 1970-01-01
        • 1970-01-01
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 2021-08-27
        相关资源
        最近更新 更多