高效的阵列访问作为多种类型

时间:2016-06-09 03:50:13

标签: c# arrays entity-framework casting

我正在使用实体框架,需要存储一些二进制数据。我正在成功地使用字节数组和一些辅助方法来返回其他格式的数据。

我是这样做的。

public class TestData
{
    public double SampleRate { get; set; }

    public byte[] ExtensionBytes { get; set; }

    /// <summary>
    /// Provides easy access as floats instead of bytes
    /// </summary>
    public float[] ExtensionValues
    {
        get
        {
            var result = new float[ExtensionBytes.Length / sizeof(float)];
            Buffer.BlockCopy(ExtensionBytes, 0, result, 0, ExtensionBytes.Length);
            return result;
        }
        set
        {
            byte[] result = new byte[value.Length * sizeof(float)];
            Buffer.BlockCopy(value, 0, result, 0, result.Length);
            ExtensionBytes = result;
        }
    }
}

它有效但看起来非常浪费,在C中我可能会使用像

这样的东西
(float*)&byte_array)

这似乎是一个更简洁的解决方案,意味着数据不会一直在内存中来回复制。

c#

中是否有类似的简洁解决方案

或者一种在实体框架中存储float或double数组的方法。

2 个答案:

答案 0 :(得分:2)

根据与浮点数组一起使用的变量的范围,您可以使用&#39; fixed&#39;在将字节数组转换为float *时将字节数组固定在内存中的关键字,并对其进行处理。像这样的东西(语法可能会关闭):

fixed (byte* b = &theByteArray)
{
    var f = (float*)b;
    // do your work on f...
}

这需要您将程序集标记为“不安全”。在项目的属性中。

答案 1 :(得分:1)

我认为Sumit是正确的,但是根据其他要求,您可以实现一个实现类似Arrayvar array = [1,2,3] array.append(4) //added an item to the stack print(array) // 1,2,3,4 let last = array.popLast() print(last) // 4 print(array) // 1,2,3 IEnumerable(或最小子集)的类的类以您需要的方式展示您的收藏。 e.g。

IList