将C#的锯齿数组转换为数组,再将其转换回去

3

我目前有一个锯齿数组Class[][][],我想将其序列化为普通的Class[]数组,然后在反序列化后将其转换回Class[][][]数组。是否可以双向转换两个数组?这些维度大小是恒定的。


2
如果你想要重建原始结构,你需要以某种方式记住不同的锯齿“位”的大小。 - Rawling
当然可以。我不确定你想要这样做的原因,但更容易的方法是将其序列化为你想要存储的格式(在这种情况下,你想将其存储为一个交错数组)。 - Security Hound
@Ramhound 我使用的Mono实现在尝试序列化嵌套数组时出现了混淆,但似乎对于一维数组没有问题。 - Rory Harvey
刚看到你的编辑 - 如果维度大小是恒定的,为什么不使用 [,,] 呢? - Rawling
3个回答

5

以下是将数据展平为一维结构的方法:

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

如果要回到多维度,这将完全取决于您尝试实现的目标/数据所代表的含义。


1
我认为 => innerInner.SelectMany() 只需要改成 => innerInner - Rawling
对于提到“回退”以及它完全依赖情况的说法,我表示认同。 - Dan Lugg

3

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

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;
}

2

我不这么认为,Rory。

如果它是一个Class[,,]多维数组,你可能能够做到这一点,但每个数组的长度可能不同,这将始终是一个障碍。

假设你将其序列化为Class[] +另一个类以给出原始维度,那么你就会成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接