【问题标题】:Convert a C# jagged array to an array and back again将 C# 锯齿状数组转换为数组并再次返回
【发布时间】:2012-07-18 12:54:38
【问题描述】:

我目前有一个锯齿状数组Class[][][],我想将其序列化为普通的Class[] 数组,然后在反序列化后转换回Class[][][] 数组。是否有可能在这两种方式之间进行转换?尺寸是固定大小的。

【问题讨论】:

  • 如果您想重建原始结构,您需要以某种方式记住锯齿状“位”的各种大小。
  • 当然...有可能。我不确定你想要这样做的原因,将它序列化为你想要存储它的方式会容易得多(在这种情况下你想将它存储为一个锯齿状数组)。
  • @Ramhound 当我尝试序列化锯齿状数组时,我正在使用的单声道的实现变得很困惑,但平面数组似乎没有问题
  • 刚刚看到您的编辑 - 如果尺寸是固定尺寸,为什么不改用[,,]

标签: c# .net arrays serialization multidimensional-array


【解决方案1】:

这是您可以展平为一维结构的方法:

var jagged = new object[][][];
var flattened = jagged.SelectMany(inner => inner.SelectMany(innerInner => innerInner)).ToArray();

至于回到多维 - 这将完全取决于你想要实现的目标/数据代表什么

【讨论】:

  • 我认为=> innerInner.SelectMany() 应该只是=> innerInner
  • +1 提及“返回”,以及它是如何完全依赖的。
【解决方案2】:

如果您不介意序列化扁平数组整数数组,您可以使用以下方法:

public static int[] JaggedSizes<T>(this T[][][] topArray)
{
    List<int> rtn = new List<int>();
    rtn.Add(topArray.Length);
    for (int i = 0; i < topArray.Length; i++)
    {
        var midArray = topArray[i];
        rtn.Add(midArray.Length);
        for (int j = 0; j < midArray.Length; j++)
        {
            var botArray = midArray[j];
            rtn.Add(botArray.Length);
        }
    }
    return rtn.ToArray();
}

// Thanks @Dave Bish
public static T[] ToFlat<T>(this T[][][] jagged)
{
    return jagged.SelectMany(inner => 
        inner.SelectMany(innerInner => innerInner)).ToArray(); 
}

public static T[][][] FromFlatWithSizes<T>(this T[] flat, int[] sizes)
{
    int inPtr = 0;
    int sPtr = 0;
    int topSize = sizes[sPtr++];
    T[][][] rtn = new T[topSize][][];
    for (int i = 0; i < topSize; i++)
    {
        int midSize = sizes[sPtr++];
        T[][] mid = new T[midSize][];
        rtn[i] = mid;
        for (int j = 0; j < midSize; j++)
        {
            int botSize = sizes[sPtr++];
            T[] bot = new T[botSize];
            mid[j] = bot;
            for (int k = 0; k < botSize; k++)
            {
                bot[k] = flat[inPtr++];
            }
        }
    }
    return rtn;
}

【讨论】:

    【解决方案3】:

    我不这么认为罗里。

    如果它是一个 Class[,,] 多维数组,您可能已经能够做到这一点,但是每个数组可能具有不同长度的事实总是会成为一个绊脚石。

    假设您将 if 作为 Class[] + 另一个类进行序列化以提供原始尺寸,那么您将是黄金。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 2018-07-26
      • 2013-09-17
      • 2018-11-05
      • 1970-01-01
      • 2011-09-13
      相关资源
      最近更新 更多