我目前有一个锯齿数组Class[][][]
,我想将其序列化为普通的Class[]
数组,然后在反序列化后将其转换回Class[][][]
数组。是否可以双向转换两个数组?这些维度大小是恒定的。
我目前有一个锯齿数组Class[][][]
,我想将其序列化为普通的Class[]
数组,然后在反序列化后将其转换回Class[][][]
数组。是否可以双向转换两个数组?这些维度大小是恒定的。
以下是将数据展平为一维结构的方法:
var jagged = new object[][][];
var flattened = jagged.SelectMany(inner => inner.SelectMany(innerInner => innerInner)).ToArray();
如果要回到多维度,这将完全取决于您尝试实现的目标/数据所代表的含义。
=> innerInner.SelectMany()
只需要改成 => innerInner
。 - Rawling如果您不介意将扁平化的数组和整数数组序列化,可以使用以下方法:
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;
}
我不这么认为,Rory。
如果它是一个Class[,,]多维数组,你可能能够做到这一点,但每个数组的长度可能不同,这将始终是一个障碍。
假设你将其序列化为Class[] +另一个类以给出原始维度,那么你就会成功。
[,,]
呢? - Rawling