Span<T> Struct
Definizione
Importante
Alcune informazioni sono relative alla release non definitiva del prodotto, che potrebbe subire modifiche significative prima della release definitiva. Microsoft non riconosce alcuna garanzia, espressa o implicita, in merito alle informazioni qui fornite.
Fornisce una rappresentazione indipendente dai tipi e sicura per la memoria di un'area contigua di memoria arbitraria.
generic <typename T>
public value class Span
[System.Runtime.InteropServices.Marshalling.NativeMarshalling(typeof(System.Runtime.InteropServices.Marshalling.SpanMarshaller<,>))]
public readonly ref struct Span<T>
public readonly ref struct Span<T>
[<System.Runtime.InteropServices.Marshalling.NativeMarshalling(typeof(System.Runtime.InteropServices.Marshalling.SpanMarshaller<,>))>]
type Span<'T> = struct
type Span<'T> = struct
Public Structure Span(Of T)
Parametri di tipo
- T
Tipo di elementi in Span<T>.
- Ereditarietà
- Attributi
Commenti
Il Span<T> tipo è uno struct di riferimento allocato nello stack anziché nell'heap gestito. I tipi di struct ref hanno alcune restrizioni per assicurarsi che non possano essere promossi all'heap gestito, incluso che non possono essere:
- Boxed.
- Assegnato alle variabili di tipo Object o
dynamico a qualsiasi tipo di interfaccia. - Campi in un tipo riferimento.
- Usato oltre
awaiti limiti eyield.
Inoltre, le chiamate ai due metodi, Equals(Object) e GetHashCode, lanciano un'eccezione NotSupportedException.
Important
Poiché si tratta di un tipo solo stack, Span<T> non è adatto per molti scenari che richiedono l'archiviazione di riferimenti ai buffer nell'heap. Questo vale, ad esempio, per le routine che effettuano chiamate asincrone al metodo. Per questi scenari, è possibile usare i tipi complementari System.Memory<T> e System.ReadOnlyMemory<T>.
Per gli intervalli che rappresentano strutture non modificabili o di sola lettura, usare System.ReadOnlySpan<T>.
Memory
Un Span<T> oggetto rappresenta un'area contigua di memoria arbitraria. Un'istanza Span<T> viene spesso utilizzata per contenere gli elementi di una matrice o una parte di una matrice. A differenza di una matrice, tuttavia, un'istanza Span<T> può puntare alla memoria gestita, alla memoria nativa o alla memoria gestita nello stack. L'esempio seguente crea un oggetto Span<Byte> da una matrice:
// Create a span over an array.
var array = new byte[100];
var arraySpan = new Span<byte>(array);
byte data = 0;
for (int ctr = 0; ctr < arraySpan.Length; ctr++)
arraySpan[ctr] = data++;
int arraySum = 0;
foreach (var value in array)
arraySum += value;
Console.WriteLine($"The sum is {arraySum}");
// Output: The sum is 4950
// Create a span over an array.
let array = Array.zeroCreate<byte> 100
let arraySpan = Span<byte> array
let mutable data = 0uy
for i = 0 to arraySpan.Length - 1 do
arraySpan[i] <- data
data <- data + 1uy
let mutable arraySum = 0
for value in array do
arraySum <- arraySum + int value
printfn $"The sum is {arraySum}"
// Output: The sum is 4950
Nell'esempio seguente viene creato un oggetto Span<Byte> da 100 byte di memoria nativa:
// Create a span from native memory.
var native = Marshal.AllocHGlobal(100);
Span<byte> nativeSpan;
unsafe
{
nativeSpan = new Span<byte>(native.ToPointer(), 100);
}
byte data = 0;
for (int ctr = 0; ctr < nativeSpan.Length; ctr++)
nativeSpan[ctr] = data++;
int nativeSum = 0;
foreach (var value in nativeSpan)
nativeSum += value;
Console.WriteLine($"The sum is {nativeSum}");
Marshal.FreeHGlobal(native);
// Output: The sum is 4950
// Create a span from native memory.
let native = Marshal.AllocHGlobal 100
let nativeSpan = Span<byte>(native.ToPointer(), 100)
let mutable data = 0uy
for i = 0 to nativeSpan.Length - 1 do
nativeSpan[i] <- data
data <- data + 1uy
let mutable nativeSum = 0
for value in nativeSpan do
nativeSum <- nativeSum + int value
printfn $"The sum is {nativeSum}"
Marshal.FreeHGlobal native
// Output: The sum is 4950
L'esempio seguente usa la parola chiave stackalloc C# per allocare 100 byte di memoria nello stack:
// Create a span on the stack.
byte data = 0;
Span<byte> stackSpan = stackalloc byte[100];
for (int ctr = 0; ctr < stackSpan.Length; ctr++)
stackSpan[ctr] = data++;
int stackSum = 0;
foreach (var value in stackSpan)
stackSum += value;
Console.WriteLine($"The sum is {stackSum}");
// Output: The sum is 4950
// Create a span on the stack.
let mutable data = 0uy
let stackSpan =
let p = NativeInterop.NativePtr.stackalloc<byte> 100 |> NativeInterop.NativePtr.toVoidPtr
Span<byte>(p, 100)
for i = 0 to stackSpan.Length - 1 do
stackSpan[i] <- data
data <- data + 1uy
let mutable stackSum = 0
for value in stackSpan do
stackSum <- stackSum + int value
printfn $"The sum is {stackSum}"
// Output: The sum is 4950
Poiché Span<T> è un'astrazione su un blocco arbitrario di memoria, i metodi del tipo e dei Span<T> metodi con Span<T> parametri operano su qualsiasi Span<T> oggetto indipendentemente dal tipo di memoria incapsulato. Ad esempio, ciascuna delle sezioni separate del codice che inizializza l'intervallo e calcola la somma dei suoi elementi può essere ristrutturata in singoli metodi di inizializzazione e calcolo, come illustrato nel seguente esempio.
public static void WorkWithSpans()
{
// Create a span over an array.
var array = new byte[100];
var arraySpan = new Span<byte>(array);
InitializeSpan(arraySpan);
Console.WriteLine($"The sum is {ComputeSum(arraySpan):N0}");
// Create an array from native memory.
var native = Marshal.AllocHGlobal(100);
Span<byte> nativeSpan;
unsafe
{
nativeSpan = new Span<byte>(native.ToPointer(), 100);
}
InitializeSpan(nativeSpan);
Console.WriteLine($"The sum is {ComputeSum(nativeSpan):N0}");
Marshal.FreeHGlobal(native);
// Create a span on the stack.
Span<byte> stackSpan = stackalloc byte[100];
InitializeSpan(stackSpan);
Console.WriteLine($"The sum is {ComputeSum(stackSpan):N0}");
}
public static void InitializeSpan(Span<byte> span)
{
byte value = 0;
for (int ctr = 0; ctr < span.Length; ctr++)
span[ctr] = value++;
}
public static int ComputeSum(Span<byte> span)
{
int sum = 0;
foreach (var value in span)
sum += value;
return sum;
}
// The example displays the following output:
// The sum is 4,950
// The sum is 4,950
// The sum is 4,950
open System
open System.Runtime.InteropServices
open FSharp.NativeInterop
// Package FSharp.NativeInterop.NativePtr.stackalloc for reuse.
let inline stackalloc<'a when 'a: unmanaged> length : Span<'a> =
let voidPointer = NativePtr.stackalloc<'a> length |> NativePtr.toVoidPtr
Span<'a>(voidPointer, length)
let initializeSpan (span: Span<byte>) =
let mutable value = 0uy
for i = 0 to span.Length - 1 do
span[i] <- value
value <- value + 1uy
let computeSum (span: Span<byte>) =
let mutable sum = 0
for value in span do
sum <- sum + int value
sum
let workWithSpans () =
// Create a span over an array.
let array = Array.zeroCreate<byte> 100
let arraySpan = Span<byte> array
initializeSpan arraySpan
printfn $"The sum is {computeSum arraySpan:N0}"
// Create an array from native memory.
let native = Marshal.AllocHGlobal 100
let nativeSpan = Span<byte>(native.ToPointer(), 100)
initializeSpan nativeSpan
printfn $"The sum is {computeSum nativeSpan:N0}"
Marshal.FreeHGlobal native
// Create a span on the stack.
let stackSpan = stackalloc 100
initializeSpan stackSpan
printfn $"The sum is {computeSum stackSpan:N0}"
// The example displays the following output:
// The sum is 4,950
// The sum is 4,950
// The sum is 4,950
Matrici
Quando esegue il wrapping di una matrice, Span<T> può eseguire il wrapping di un'intera matrice, come negli esempi nella sezione Memoria . Poiché supporta il sezionamento, Span<T> può anche puntare a qualsiasi intervallo contiguo all'interno della matrice.
Nell'esempio seguente viene creata una sezione dei cinque elementi centrali di una matrice integer a 10 elementi. Si noti che il codice raddoppia i valori di ogni numero intero nella slice. Come illustrato nell'output, le modifiche apportate dall'intervallo vengono riflesse nei valori della matrice.
using System;
var array = new int[] { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 };
var slice = new Span<int>(array, 2, 5);
for (int ctr = 0; ctr < slice.Length; ctr++)
slice[ctr] *= 2;
// Examine the original array values.
foreach (var value in array)
Console.Write($"{value} ");
Console.WriteLine();
// The example displays the following output:
// 2 4 12 16 20 24 28 16 18 20
module Program
open System
[<EntryPoint>]
let main _ =
let array = [| 2; 4; 6; 8; 10; 12; 14; 16; 18; 20 |]
let slice = Span<int>(array, 2, 5)
for i = 0 to slice.Length - 1 do
slice[i] <- slice[i] * 2
// Examine the original array values.
for value in array do
printf $"{value} "
printfn ""
0
// The example displays the following output:
// 2 4 12 16 20 24 28 16 18 20
Sezioni
Span<T> include due sovraccarichi del Slice metodo che formano un segmento dall'intervallo corrente che inizia in corrispondenza di un indice specificato. In questo modo è possibile considerare i dati in come Span<T> un set di blocchi logici che possono essere elaborati in base alle esigenze da parti di una pipeline di elaborazione dati con un impatto minimo sulle prestazioni. Ad esempio, poiché i protocolli server moderni sono spesso basati su testo, la manipolazione di stringhe e sottostringhe è particolarmente importante. Nella classe String, il metodo principale per l'estrazione di sottostringhe è Substring. Per le pipeline di dati che si basano su una manipolazione estesa delle stringhe, il suo utilizzo comporta alcune penalità per le prestazioni, poiché esso:
- Crea una nuova stringa per contenere la sottostringa.
- Copia un subset dei caratteri dalla stringa originale alla nuova stringa.
Questa operazione di allocazione e copia può essere eliminata usando Span<T> o ReadOnlySpan<T>, come illustrato nell'esempio seguente:
using System;
class Program2
{
static void Run()
{
string contentLength = "Content-Length: 132";
var length = GetContentLength(contentLength.ToCharArray());
Console.WriteLine($"Content length: {length}");
}
private static int GetContentLength(ReadOnlySpan<char> span)
{
var slice = span.Slice(16);
return int.Parse(slice);
}
}
// Output:
// Content length: 132
module Program2
open System
let getContentLength (span: ReadOnlySpan<char>) =
let slice = span.Slice 16
Int32.Parse slice
let contentLength = "Content-Length: 132"
let length = getContentLength (contentLength.ToCharArray())
printfn $"Content length: {length}"
// Output:
// Content length: 132
Costruttori
| Nome | Descrizione |
|---|---|
| Span<T>(T) |
Crea un nuovo Span<T> valore di lunghezza 1 intorno al riferimento specificato. |
| Span<T>(T[], Int32, Int32) |
Crea un nuovo Span<T> oggetto che include un numero specificato di elementi di una matrice a partire da un indice specificato. |
| Span<T>(T[]) |
Crea un nuovo Span<T> oggetto sull'intera matrice specificata. |
| Span<T>(Void*, Int32) |
Crea un nuovo Span<T> oggetto da un numero specificato di elementi a partire da un indirizzo di |
Proprietà
| Nome | Descrizione |
|---|---|
| Empty |
Restituisce un oggetto vuoto Span<T> . |
| IsEmpty |
Restituisce un valore che indica se l'oggetto corrente Span<T> è vuoto. |
| Item[Int32] |
Ottiene l'elemento in corrispondenza dell'indice in base zero specificato. |
| Length |
Restituisce la lunghezza dell'intervallo corrente. |
Metodi
| Nome | Descrizione |
|---|---|
| Clear() |
Cancella il contenuto di questo Span<T> oggetto. |
| CopyTo(Span<T>) |
Copia il contenuto di questo Span<T> oggetto in una destinazione Span<T>. |
| Equals(Object) |
Obsoleti.
Obsoleti.
Le chiamate a questo metodo non sono supportate. |
| Fill(T) |
Riempie gli elementi di questo intervallo con un valore specificato. |
| GetEnumerator() |
Restituisce un enumeratore per l'oggetto Span<T>. |
| GetHashCode() |
Obsoleti.
Genera un oggetto NotSupportedException. |
| GetPinnableReference() |
Restituisce un riferimento a un oggetto di tipo T che può essere utilizzato per l'aggiunta. Questo metodo è progettato per supportare .NET compilatori e non deve essere chiamato dal codice utente. |
| Slice(Int32, Int32) |
Forma una sezione dall'intervallo corrente a partire da un indice specificato per una lunghezza specificata. |
| Slice(Int32) |
Forma una sezione dall'intervallo corrente che inizia in corrispondenza di un indice specificato. |
| ToArray() |
Copia il contenuto di questo intervallo in una nuova matrice. |
| ToString() |
Restituisce la rappresentazione di stringa di questo Span<T> oggetto. |
| TryCopyTo(Span<T>) |
Tenta di copiare l'oggetto corrente Span<T> in una destinazione Span<T> e restituisce un valore che indica se l'operazione di copia è riuscita. |
Operatori
| Nome | Descrizione |
|---|---|
| Equality(Span<T>, Span<T>) |
Restituisce un valore che indica se due Span<T> oggetti sono uguali. |
| Implicit(ArraySegment<T> to Span<T>) |
Definisce una conversione implicita di un oggetto ArraySegment<T> in un oggetto Span<T>. |
| Implicit(Span<T> to ReadOnlySpan<T>) |
Definisce una conversione implicita di un oggetto Span<T> in un oggetto ReadOnlySpan<T>. |
| Implicit(T[] to Span<T>) |
Definisce una conversione implicita di una matrice in un oggetto Span<T>. |
| Inequality(Span<T>, Span<T>) |
Restituisce un valore che indica se due Span<T> oggetti non sono uguali. |
Metodi di estensione
| Nome | Descrizione |
|---|---|
| BinarySearch<T,TComparable>(Span<T>, TComparable) |
Cerca un intero oggetto ordinato per un valore usando il tipo generico Span<T> specificato |
| BinarySearch<T,TComparer>(Span<T>, T, TComparer) |
Cerca un intero oggetto ordinato Span<T> per un valore specificato usando il tipo generico specificato |
| BinarySearch<T>(Span<T>, IComparable<T>) |
Cerca un intero oggetto ordinato Span<T> per un valore usando l'interfaccia generica specificata IComparable<T> . |
| CommonPrefixLength<T>(Span<T>, ReadOnlySpan<T>, IEqualityComparer<T>) |
Trova la lunghezza di qualsiasi prefisso comune condiviso tra |
| CommonPrefixLength<T>(Span<T>, ReadOnlySpan<T>) |
Trova la lunghezza di qualsiasi prefisso comune condiviso tra |
| Contains<T>(Span<T>, T) |
Indica se un valore specificato viene trovato in un intervallo. |
| ContainsAny<T>(Span<T>, ReadOnlySpan<T>) |
Cerca un'occorrenza di uno dei valori specificati |
| ContainsAny<T>(Span<T>, SearchValues<T>) |
Cerca un'occorrenza di uno dei valori specificati |
| ContainsAny<T>(Span<T>, T, T, T) |
Cerca un'occorrenza di |
| ContainsAny<T>(Span<T>, T, T) |
Cerca un'occorrenza di |
| ContainsAnyExcept<T>(Span<T>, ReadOnlySpan<T>) |
Cerca nell'intervallo specificato qualsiasi valore diverso dall'oggetto specificato |
| ContainsAnyExcept<T>(Span<T>, SearchValues<T>) |
Cerca nell'intervallo specificato qualsiasi valore diverso dall'oggetto specificato |
| ContainsAnyExcept<T>(Span<T>, T, T, T) |
Cerca qualsiasi valore diverso da |
| ContainsAnyExcept<T>(Span<T>, T, T) |
Cerca qualsiasi valore diverso da |
| ContainsAnyExcept<T>(Span<T>, T) |
Cerca nell'intervallo specificato qualsiasi valore diverso dall'oggetto specificato |
| ContainsAnyExceptInRange<T>(Span<T>, T, T) |
Cerca qualsiasi valore al di fuori dell'intervallo compreso tra |
| ContainsAnyInRange<T>(Span<T>, T, T) |
Cerca qualsiasi valore nell'intervallo compreso tra |
| Count<T>(Span<T>, ReadOnlySpan<T>) |
Conta il numero di volte in cui si verifica l'oggetto specificato |
| Count<T>(Span<T>, T) |
Conta il numero di volte in cui si verifica l'oggetto specificato |
| EndsWith<T>(Span<T>, ReadOnlySpan<T>) |
Determina se la sequenza specificata viene visualizzata alla fine di un intervallo. |
| IndexOf<T>(Span<T>, ReadOnlySpan<T>) |
Cerca la sequenza specificata e restituisce l'indice della prima occorrenza. |
| IndexOf<T>(Span<T>, T) |
Cerca il valore specificato e restituisce l'indice della prima occorrenza. |
| IndexOfAny<T>(Span<T>, ReadOnlySpan<T>) |
Cerca il primo indice di uno dei valori specificati. |
| IndexOfAny<T>(Span<T>, SearchValues<T>) |
Cerca il primo indice di uno dei valori specificati. |
| IndexOfAny<T>(Span<T>, T, T, T) |
Cerca il primo indice di uno dei valori specificati. |
| IndexOfAny<T>(Span<T>, T, T) |
Cerca il primo indice di uno dei valori specificati. |
| IndexOfAnyExcept<T>(Span<T>, ReadOnlySpan<T>) |
Cerca il primo indice di qualsiasi valore diverso dall'oggetto specificato |
| IndexOfAnyExcept<T>(Span<T>, SearchValues<T>) |
Cerca il primo indice di qualsiasi valore diverso dall'oggetto specificato |
| IndexOfAnyExcept<T>(Span<T>, T, T, T) |
Cerca il primo indice di qualsiasi valore diverso da |
| IndexOfAnyExcept<T>(Span<T>, T, T) |
Cerca il primo indice di qualsiasi valore diverso dai due valori specificati. |
| IndexOfAnyExcept<T>(Span<T>, T) |
Cerca il primo indice di qualsiasi valore diverso dall'oggetto specificato |
| IndexOfAnyExceptInRange<T>(Span<T>, T, T) |
Cerca il primo indice di qualsiasi valore al di fuori dell'intervallo tra |
| IndexOfAnyInRange<T>(Span<T>, T, T) |
Cerca il primo indice di qualsiasi valore nell'intervallo compreso tra |
| LastIndexOf<T>(Span<T>, ReadOnlySpan<T>) |
Cerca la sequenza specificata e restituisce l'indice dell'ultima occorrenza. |
| LastIndexOf<T>(Span<T>, T) |
Cerca il valore specificato e restituisce l'indice dell'ultima occorrenza. |
| LastIndexOfAny<T>(Span<T>, ReadOnlySpan<T>) |
Cerca l'ultimo indice di uno dei valori specificati. |
| LastIndexOfAny<T>(Span<T>, SearchValues<T>) |
Cerca l'ultimo indice di uno dei valori specificati. |
| LastIndexOfAny<T>(Span<T>, T, T, T) |
Cerca l'ultimo indice di uno dei valori specificati. |
| LastIndexOfAny<T>(Span<T>, T, T) |
Cerca l'ultimo indice di uno dei valori specificati. |
| LastIndexOfAnyExcept<T>(Span<T>, ReadOnlySpan<T>) |
Cerca l'ultimo indice di qualsiasi valore diverso dall'oggetto specificato |
| LastIndexOfAnyExcept<T>(Span<T>, SearchValues<T>) |
Cerca l'ultimo indice di qualsiasi valore diverso dall'oggetto specificato |
| LastIndexOfAnyExcept<T>(Span<T>, T, T, T) |
Cerca l'ultimo indice di qualsiasi valore diverso da , |
| LastIndexOfAnyExcept<T>(Span<T>, T, T) |
Cerca l'ultimo indice di qualsiasi valore diverso dall'oggetto specificato |
| LastIndexOfAnyExcept<T>(Span<T>, T) |
Cerca l'ultimo indice di qualsiasi valore diverso dall'oggetto specificato |
| LastIndexOfAnyExceptInRange<T>(Span<T>, T, T) |
Cerca l'ultimo indice di qualsiasi valore al di fuori dell'intervallo tra |
| LastIndexOfAnyInRange<T>(Span<T>, T, T) |
Cerca l'ultimo indice di qualsiasi valore nell'intervallo compreso tra |
| Overlaps<T>(Span<T>, ReadOnlySpan<T>, Int32) |
Determina se un intervallo e un intervallo di sola lettura si sovrappongono nella memoria e restituisce l'offset dell'elemento. |
| Overlaps<T>(Span<T>, ReadOnlySpan<T>) |
Determina se un intervallo e un intervallo di sola lettura si sovrappongono in memoria. |
| Replace<T>(Span<T>, T, T, IEqualityComparer<T>) |
Sostituire tutte le occorrenze di |
| Replace<T>(Span<T>, T, T) |
Sostituire tutte le occorrenze di |
| ReplaceAny<T>(Span<T>, SearchValues<T>, T) |
Sostituisce in |
| ReplaceAnyExcept<T>(Span<T>, SearchValues<T>, T) |
Sostituisce in |
| Reverse<T>(Span<T>) |
Inverte la sequenza degli elementi nell'intero intervallo. |
| SequenceCompareTo<T>(Span<T>, ReadOnlySpan<T>) |
Determina l'ordine relativo di un intervallo e un intervallo di sola lettura confrontando gli elementi usando IComparable{T}. CompareTo(T). |
| SequenceEqual<T>(Span<T>, ReadOnlySpan<T>, IEqualityComparer<T>) |
Determina se due sequenze sono uguali confrontando gli elementi usando un oggetto IEqualityComparer<T>. |
| SequenceEqual<T>(Span<T>, ReadOnlySpan<T>) |
Determina se un intervallo e un intervallo di sola lettura sono uguali confrontando gli elementi usando IEquatable{T}. Equals(T). |
| Sort<T,TComparer>(Span<T>, TComparer) |
Ordina gli elementi nell'intero Span<T> oggetto utilizzando . |
| Sort<T>(Span<T>, Comparison<T>) |
Ordina gli elementi nell'intero Span<T> oggetto utilizzando l'oggetto specificato Comparison<T>. |
| Sort<T>(Span<T>) |
Ordina gli elementi nell'intero Span<T> oggetto utilizzando l'implementazione IComparable<T> di ogni elemento dell'oggetto Span<T>. |
| Sort<TKey,TValue,TComparer>(Span<TKey>, Span<TValue>, TComparer) |
Ordina una coppia di intervalli (uno contenente le chiavi e l'altro contenente gli elementi corrispondenti) in base alle chiavi nel primo Span<T> utilizzando l'operatore di confronto specificato. |
| Sort<TKey,TValue>(Span<TKey>, Span<TValue>, Comparison<TKey>) |
Ordina una coppia di intervalli (uno contenente le chiavi e l'altro contenente gli elementi corrispondenti) in base alle chiavi nel primo Span<T> usando il confronto specificato. |
| Sort<TKey,TValue>(Span<TKey>, Span<TValue>) |
Ordina una coppia di intervalli (uno contenente le chiavi e l'altro contenente gli elementi corrispondenti) in base alle chiavi del primo Span<T> usando l'implementazione IComparable<T> di ogni chiave. |
| StartsWith<T>(Span<T>, ReadOnlySpan<T>) |
Determina se una sequenza specificata viene visualizzata all'inizio di un intervallo. |
| ToImmutableArray<T>(Span<T>) |
Converte l'intervallo in una matrice non modificabile. |
| Trim<T>(Span<T>, ReadOnlySpan<T>) |
Rimuove tutte le occorrenze iniziali e finali di un set di elementi specificato in un intervallo di sola lettura da un intervallo. |
| Trim<T>(Span<T>, T) |
Rimuove tutte le occorrenze iniziali e finali di un elemento specificato da un intervallo. |
| TrimEnd<T>(Span<T>, ReadOnlySpan<T>) |
Rimuove tutte le occorrenze finali di un set di elementi specificato in un intervallo di sola lettura da un intervallo. |
| TrimEnd<T>(Span<T>, T) |
Rimuove tutte le occorrenze finali di un elemento specificato da un intervallo. |
| TrimStart<T>(Span<T>, ReadOnlySpan<T>) |
Rimuove tutte le occorrenze iniziali di un set di elementi specificato in un intervallo di sola lettura dall'intervallo. |
| TrimStart<T>(Span<T>, T) |
Rimuove tutte le occorrenze iniziali di un elemento specificato dall'intervallo. |