Span2D<T>
Span2D<T>
è un tipo che rispecchia la funzionalità del Span<T>
tipo, ma supporta le aree di memoria 2D. Proprio come Memory2D<T>
, è estremamente flessibile e può eseguire il wrapping di un numero di oggetti diversi, nonché puntatori nativi o riferimenti GC.
Il layout interno è simile a quello usato dal Memory2D<T>
tipo, incluso un parametro pitch usato per abilitare il supporto per buffer di memoria disconti. È possibile leggere altre informazioni su questo contenuto nella Memory2D<T>
documentazione.
API della piattaforma:
Span2D<T>
,Memory2D<T>
,ReadOnlySpan2D<T>
Sintassi
Ecco come creare un'istanza Span2D<T>
da una matrice 2D:
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 }
È anche possibile creare direttamente una visualizzazione 2D sulla memoria nativa:
int* p = stackalloc int[9];
Span2D<int> span = new Span2D<int>(p, 3, 3);
Il Span2D<T>
tipo include anche tipi di enumeratore personalizzati per attraversare facilmente una determinata riga, una colonna o l'intera area di memoria usando la sintassi standard foreach
in C#, nonché l'esecuzione di operazioni bulk in una singola chiamata:
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>
del Span2D<T>
tipo che corrisponde ReadOnlySpan<T>
a Span<T>
. Espone un set simile di API, ma non consente di modificare direttamente il contenuto dell'area di memoria sottostante.
Codice di esempio
Altri esempi sono disponibili negli unit test.
.NET Community Toolkit