您好我正在尝试编写然后将3d数组字符串读取到文件中。该数组声明为theatre[5, 5, 9]
。我一直在寻找,但无法找到我理解的任何东西。它基本上只是在wp8应用程序中切换页面。
我怎样才能做到这一点?
任何帮助深表感谢。
感谢。
答案 0 :(得分: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;
}
将数据序列化为文件取决于数据的内容。您可以选择未出现在任何数据中的分隔符,并使用分隔符连接字符串。
如果无法确定不同的分隔符,您可以根据自己的需要选择一个,并预处理字符串,以便分隔符在数据中自然出现的位置进行转义。这通常是通过将分隔符插入字符串中使其显示为twise来完成的。然后在读取文件时处理这个(即:成对的分隔符=字符数据的自然出现)。
另一种方法是将所有内容都转换为十六进制,并使用一些任意分隔符。这或多或少会使文件大小加倍。
答案 1 :(得分:0)
从你上次的评论来看,你似乎不需要3D阵列,即使依靠最快/最脏的方法,你也可以/应该使用2D阵列。但是,您可以通过创建具有所需属性的自定义类来避免第二个维度。示例代码:
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);
其中seat
由以下代码定义:
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; }
}