2

現在、通常の配列Class[][][]としてシリアル化し、逆シリアル化後に配列に変換したいギザギザの配列があります。2つの双方向の間で変換することはまったく可能ですか? 寸法は一定サイズです。Class[]Class[][][]

4

3 に答える 3

5

これは、1 次元構造にフラット化する方法です。

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

多次元に戻ることについて-これは、達成しようとしていること/データが何を表しているかによって完全に異なります

于 2012-07-19T11:01:50.677 に答える
3

フラット化された配列とintの配列をシリアル化してもかまわない場合は、次を使用できます。

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;
}
于 2012-07-19T11:21:58.773 に答える
2

私はそうは思いません。

Class[,,] 多次元配列であれば、これを行うことができたかもしれませんが、各配列の長さが異なる可能性があるという事実は、常に障害になります。

if を Class[] + 別のクラスとしてシリアライズして元のサイズを取得すると仮定すると、ゴールデンになります。

于 2012-07-19T10:47:39.120 に答える