c# 中的索引泛型(multi-type,单值)多维数组
Indexed generic (multi-type, single value) multidimensional array in c#
任务:
从二进制文件中读取数组(跟踪数据),其中数组的数量、长度和数据类型在文件开头定义 (header)。
条件:
- 每个数组的数据类型可能不同,但一个数组具有相同的类型。
- 每个数组的长度相同,但数组的数量可能不同。
- 数据类型定义为数字
- Informativ for code implementation -> 每个数据类型在文件中有 4 个字节的长度
意向:
我想要一个多维 Arry(或带数组的列表),我可以在其中获取和设置每个值。
状态:
根据我的研究,我已经可以构建以下代码(不知道是否有更好的方法!?可能使用数组?)。
(最佳研究结果:Best way to design a multi-type object)
private abstract class TraceData
{
}
private class TraceData<T> : TraceData
{
public T[] Data;
public TraceData(UInt32 length)
{
Data = new T[length];
}
public T this[int index]
{
get { return Data[index]; }
set { Data[index] = value; }
}
}
private class Traces
{
public List<TraceData> Data;
public Traces(TraceHeader Header, Byte[] file, int offset)
{
Data = new List<TraceData>();
for (int i = 0; i < Header.DataAmount; i++)
{
TraceData tmp;
switch (Header.DataTyp[i])
{
case 2:
tmp = new TraceData<SByte>(Header.DataLength);
break;
case 3:
tmp = new TraceData<Int16>(Header.DataLength);
break;
//...
default:
tmp = new TraceData<Int32>(Header.DataLength);
break;
}
Data.Add(tmp);
}
for (int i = 0; i < Header.DataLength; i++)
{
for (int j = 0; j < Header.DataAmount; j++)
{
switch (Header.DataTyp[j])
{
case 2:
Data[j][i] = (SByte)file[offset + i*Header.DataAmount*4 + j*4 + 3];
break;
case 3:
Data[j][i] = BitConverter.ToUInt16(file, offset + i*Header.DataAmount*4 + j*4 + 2);
break;
//...
default:
Data[j][i] = BitConverter.ToUInt32(file, offset + i*Header.DataAmount*4 + j*4 + 0);
break;
}
}
}
}
}
问题:
使用该代码,我无法索引 TraceData 类型的元素。
希望你能帮上忙。
谢谢
我猜他的意思是访问通用类型 TraceData 的数据数组,但他只知道抽象基础类型的对象-class TraceData。像这些调用不起作用:
Data[j][i] = (SByte)file[offset + i*Header.DataAmount*4 + j*4 + 3];
因为Data[j]是TraceData类型。在任何情况下,您都需要知道该特定实例中所用类型的通用参数。所以你可以投(SByte 的例子):
TraceData<SByte> SByteTraceData = (TraceData<SByte>)Data[j];
SByteTraceData[i] = (SByte)file[offset + i * Header.DataAmount * 4 + j * 4 + 3];
任务:
从二进制文件中读取数组(跟踪数据),其中数组的数量、长度和数据类型在文件开头定义 (header)。
条件:
- 每个数组的数据类型可能不同,但一个数组具有相同的类型。
- 每个数组的长度相同,但数组的数量可能不同。
- 数据类型定义为数字
- Informativ for code implementation -> 每个数据类型在文件中有 4 个字节的长度
意向:
我想要一个多维 Arry(或带数组的列表),我可以在其中获取和设置每个值。
状态:
根据我的研究,我已经可以构建以下代码(不知道是否有更好的方法!?可能使用数组?)。
(最佳研究结果:Best way to design a multi-type object)
private abstract class TraceData
{
}
private class TraceData<T> : TraceData
{
public T[] Data;
public TraceData(UInt32 length)
{
Data = new T[length];
}
public T this[int index]
{
get { return Data[index]; }
set { Data[index] = value; }
}
}
private class Traces
{
public List<TraceData> Data;
public Traces(TraceHeader Header, Byte[] file, int offset)
{
Data = new List<TraceData>();
for (int i = 0; i < Header.DataAmount; i++)
{
TraceData tmp;
switch (Header.DataTyp[i])
{
case 2:
tmp = new TraceData<SByte>(Header.DataLength);
break;
case 3:
tmp = new TraceData<Int16>(Header.DataLength);
break;
//...
default:
tmp = new TraceData<Int32>(Header.DataLength);
break;
}
Data.Add(tmp);
}
for (int i = 0; i < Header.DataLength; i++)
{
for (int j = 0; j < Header.DataAmount; j++)
{
switch (Header.DataTyp[j])
{
case 2:
Data[j][i] = (SByte)file[offset + i*Header.DataAmount*4 + j*4 + 3];
break;
case 3:
Data[j][i] = BitConverter.ToUInt16(file, offset + i*Header.DataAmount*4 + j*4 + 2);
break;
//...
default:
Data[j][i] = BitConverter.ToUInt32(file, offset + i*Header.DataAmount*4 + j*4 + 0);
break;
}
}
}
}
}
问题:
使用该代码,我无法索引 TraceData 类型的元素。
希望你能帮上忙。 谢谢
我猜他的意思是访问通用类型 TraceData 的数据数组,但他只知道抽象基础类型的对象-class TraceData。像这些调用不起作用:
Data[j][i] = (SByte)file[offset + i*Header.DataAmount*4 + j*4 + 3];
因为Data[j]是TraceData类型。在任何情况下,您都需要知道该特定实例中所用类型的通用参数。所以你可以投(SByte 的例子):
TraceData<SByte> SByteTraceData = (TraceData<SByte>)Data[j];
SByteTraceData[i] = (SByte)file[offset + i * Header.DataAmount * 4 + j * 4 + 3];