0

こんにちは、文字列の 3D 配列をファイルに書き込んで読み込もうとしています。配列は として宣言されtheatre[5, 5, 9]ます。私は探していましたが、私が理解しているものを見つけることができません。基本的には、wp8 アプリでページを切り替えるだけです。これどうやってするの?どんな助けでも大歓迎です。ありがとう。

4

2 に答える 2

1

編集:BinaryFormatter.Serialize()そのままアレイに直接使用できるようです。次のようになります。

using System.Runtime.Serialization.Formatters.Binary;

...    

// writing
FileStream fs = File.Open("...");
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, theArray);

// reading
string[,,] theArray;
FileStream fs = File.Open("...");
BinaryFormatter bf = new BinaryFormatter();
theArray = (string[,,])bf.Deserialize(fs);

最初の解決策 (BinaryFormatter が失敗した場合はこれを試してください):

次のように、3D と 1D の間で変換できます。

struct Vector {
    public int x;
    public int y;
    public int z;

    Vector(int x, int y, int z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }
}

Vector GetIndices3d(int i, Vector bounds)
{
    Vector indices = new Vector();

    int zSize = bounds.x * bounds.y;
    indices.x = (i % zSize) % bounds.x;
    indices.y = (i % zSize) / bounds.x;
    indices.z = i / zSize;

    return indices;
}

int GetIndex1d(Vector indices, Vector bounds)
{
    return (indices.z * (bounds.x * bounds.y)) +
        (indices.y * bounds.x) +
        indices.x;
}

次に、3D 配列を 1D 配列に変換し、それをファイルにシリアル化するだけです。読むときはその逆。

string[] Get1dFrom3d(string[,,] data)
{
    Vector bounds = new Vector(data.GetLength(0), data.GetLength(1), data.GetLength(2));
    string[] result = new string[data.Length];

    Vector v;
    for (int i = 0; i < data.Length; ++i)
    {
        v = GetIndices3d(i, bounds);
        result[i] = data[v.x, v.y, v.z];
    }

    return result;
}

string[,,] Get3dFrom1d(string[] data, Vector bounds)
{
    string[,,] result = new string[bounds.x, bounds.y, bounds.z];

    Vector v;
    for (int i = 0; i < data.Length; ++i)
    {
        v = GetIndices3d(i, bounds);
        result[v.x, v.y, v.z] = data[i];
    }

    return result;
}

ファイルへのデータのシリアル化は、データの内容によって異なります。どのデータにも表示されない区切り文字を選択し、区切り文字を使用して文字列を連結できます。

明確な区切り文字を決定できない場合は、都合のよいときに 1 つを選択し、文字列を前処理して、データ内で自然に現れる場所で区切り文字がエスケープされるようにすることができます。これは通常、文字列内の表示される場所にセパレータを挿入して、2 回表示されるようにすることによって行われます。次に、ファイルを読み取るときにこれを処理します (つまり、区切り文字のペア = 文字データの自然発生)。

別のアプローチは、すべてを 16 進数に変換し、任意の区切り文字を使用することです。これにより、ファイル サイズがほぼ 2 倍になります。

于 2013-09-17T13:23:45.490 に答える
0

あなたの最後のコメントから、3D配列は必要ないようです。最も速い/最も汚いアプローチに頼っても、2D配列を使用できます/使用する必要があります。ただし、必要なプロパティを持つカスタム クラスを作成することで、2 番目の次元を回避できます。サンプルコード:

seat[] theatre = new seat[5]; //5 seats

int count0 = -1;
do
{
    count0 = count0 + 1; //Seat number
    theatre[count0] = new seat();

    theatre[count0].X = 1; //X value for Seat count0
    theatre[count0].Y = 2; //Y value for Seat count0
    theatre[count0].Prop1 = "prop 1"; //Prop1 for Seat count0
    theatre[count0].Prop2 = "prop 2"; //Prop2 for Seat count0
    theatre[count0].Prop3 = "prop 3"; //Prop3 for Seat count0

} while (count0 < theatre.GetLength(0) - 1);

whereseatは次のコードで定義されます。

class seat
{
    public int X { get; set; }
    public int Y { get; set; }
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
    public string Prop3 { get; set; }
}
于 2013-09-17T12:56:06.373 に答える