我在C#中有一个存储数据的float数组。但是,我需要将数据转换为像Vector2,Vector3等结构。结构只保存浮点数,因此在字节方面没有数据类型转换,仅在访问时。
例如:
struct Vector3
{
public float x;
public float y;
public float z;
//plus some methods
}
我可以通过创建一个新数组手动将整个float数组复制到struct one,但对于大数组来说这有点慢。我试图在不安全的代码中进行转换,但是使用泛型不起作用并且为我所拥有的每个结构创建特殊方法有点像#34;怪异的"。
在C ++中,我有类似的东西:
float * arrayFloat = ....
Vector3 * arrayVector3 = reinterpret_cast<Vector3 *>(arrayFloat);
但这不是C#中的选项......
任何想法如何实现这一目标,或者如何改变设计?
答案 0 :(得分:4)
你可以在你的结构中添加一个构造函数:
struct Vector3
{
public float x;
public float y;
public float z;
public Vector3(float[] vals)
{
if(vals.Length != 3)
throw new ArgumentException();
x = vals[0]; y = vals[1]; z = vals[2];
}
}
...别处
float[] myFloats = { 0.0f, 1.1f, 2.2f };
var myVec = new Vector3(myFloats);
如果你问是否有什么东西可以让你在没有任何工作的情况下做到这一点,答案是否定的。从数组到您选择的结构的任何转换都必须由您实现,最好是在您的结构中。
答案 1 :(得分:0)
我是C#的新手,我一直在同一个问题中挣扎,我发现有用的是使用一个枚举器,该枚举器懒惰地转换访问时的每个元素:
Vector3
使用此方法,您不需要复制整个数组,并且编译器很可能不会在内存中创建类型为datepicker-template-url
的新对象,而是会使用寄存器。
答案 2 :(得分:0)
我相信,使用.NET Core 2.1的MemoryMarshal
方法,此方法可以对您的结构起作用。
我的回答here描述了如何。实质是:
var vectors = MemoryMarshal.Cast<float, Vector3>(floatArray.AsSpan());
var firstVector = vectors[0];
这相当于C#的重新解释类型转换。