gpt4 book ai didi

c# - 跨度和二维数组

转载 作者:行者123 更新时间:2023-11-30 14:21:48 30 4
gpt4 key购买 nike

是否可以使用新的 System.Memory Span struct二维数据数组?

double[,] testMulti = 
{
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 9.5f, 10, 11 },
{ 12, 13, 14.3f, 15 }
};

double[] testArray = { 1, 2, 3, 4 };
string testString = "Hellow world";

testMulti.AsSpan(); // Compile error
testArray.AsSpan();
testString.AsSpan();

虽然 testArray 和 testString 有一个 AsSpan 扩展,但 testMulti 没有这样的扩展。

Span 的设计是否仅限于处理一维数据数组?
我还没有找到使用 Span 处理 testMulti 数组的明显方法。

最佳答案

您可以创建一个 Span使用非托管内存。这将允许您随意切片和切 block

unsafe
{
Span<T> something = new Span<T>(pointerToarray, someLength);
}

完整演示

unsafe public static void Main(string[] args)
{
double[,] doubles = {
{ 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9, 9.5f, 10, 11 },
{ 12, 13, 14.3f, 15 }
};

var length = doubles.GetLength(0) * doubles.GetLength(1);

fixed (double* p = doubles)
{
var span = new Span<double>(p, length);
var slice = span.Slice(6, 5);

foreach (var item in slice)
Console.WriteLine(item);
}
}

输出

7
8
9
9.5
10

其他选择是重新分配到一维数组,接受惩罚并且不要传递-Go

  • BlockCopy
  • 或 p/调用 memcpy直接使用unsafe和指点
  • Cast<T>例如 multiDimensionalArrayData.Cast<byte>().ToArray()

前 2 个对于大型数组来说性能更高。

关于c# - 跨度和二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52750582/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com