将C#锯齿状数组转换为数组并再次返回

时间:2012-07-19 10:45:25

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

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

3 个答案:

答案 0 :(得分:5)

这是你可以扁平化为一维结构的方法:

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

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

答案 1 :(得分:2)

我不这么认为罗里。

如果它是一个Class [,,]多维数组,你可能已经能够做到这一点,但每个数组可能长度不同的事实将永远是一个绊脚石。

假设您将序列化作为一个Class [] +另一个类来给你原始尺寸,那么你将是金色的。

答案 2 :(得分: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;
}