Span2D<T>
Span2D<T>
是一种反映 Span<T>
类型功能的类型,但支持 2D 内存区域。 就像 Memory2D<T>
一样,它非常灵活,可以包装许多不同的对象,以及本机指针或 GC 引用。
内部布局类似于 Memory2D<T>
类型使用的布局,包括用于启用对不连续内存缓冲区的支持的间距参数。 有关此内容的详细信息,请参阅 Memory2D<T>
文档。
语法
以下是根据 2D 数组创建 Span2D<T>
实例的方法:
int[,] array =
{
{ 1, 2, 3 },
{ 4, 5, 6 }
};
Span2D<int> span = array;
// The memory directly maps the 2*3 array here
span[0, 0] = 10;
span[2, 1] = 20;
// The array is now:
// { 10, 2, 3 },
// { 4, 20, 6 }
// We can also use indices, on supported runtimes
int x = span[0, ^1];
// We can also get references to items, like with arrays
ref int reference = ref span[1, 1];
Span2D<int> slice = span.Slice(0, 1, 2, 2);
// Or alternatively, on supported runtimes
slice = span[.., 1..];
int[,] copy = slice.ToArray();
// The resulting array is:
// { 2, 3 },
// { 20, 6 }
还可以直接基于本机内存创建 2D 视图:
int* p = stackalloc int[9];
Span2D<int> span = new Span2D<int>(p, 3, 3);
Span2D<T>
类型还包括自定义枚举器类型,以便使用 C# 中的标准 foreach
语法轻松遍历给定的行、列或整个内存区域,以及在单个调用中执行批量操作:
int[,] array =
{
{ 1, 2, 3 },
{ 4, 5, 6 },
{ 7, 8, 9 }
};
Span2D<int> span = array;
foreach (int i in span.GetColumn(1))
{
// 2, 5, 8
}
// We can also iterate by reference
foreach (ref int i in span.GetRow(2))
{
// 7, 8, 9
}
foreach (int i in span)
{
// 1, 2, 3, 4, 5...
}
// Set all items in a column to 0
span.GetColumn(0).Clear();
// Set the value of all items in a row
span.GetRow(1).Fill(42);
Span<int> copy = stackalloc int[3];
// Copy all items from a column
span.GetColumn(2).CopyTo(copy);
// Get a copy of a row as an array
int[] array = span.GetRow(1).ToArray();
ReadOnlySpan2D<T>
ReadOnlySpan2D<T>
之于 Span2D<T>
类型,正如 ReadOnlySpan<T>
之于 Span<T>
。 它公开一组类似的 API,但无法直接修改基础内存区域的内容。
代码示例
可以在单元测试中查找更多示例。