APIs de string como Span (emulação no C# 6)
Emule string como span: converta para char[], faça recortes com ArraySegment , pesquise, remova espaços e analise por índices e crie substrings somente nas extremidades.
APIs de string como Span (emulação no C# 6) é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 3 de 3. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 3 aulas no total.
Plano: texto como fatias
Objetivo: usar no C# 6 a abordagem de tratar texto como uma visão.
- Converta uma vez para uma matriz de caracteres
- Use ArraySegment<char> como uma visão
- Apare, pesquise e analise por índices
- Crie subtextos somente na fronteira
Janela sobre texto
Crie uma janela sobre o texto convertendo-o uma vez para uma matriz de caracteres; depois, trabalhe com deslocamento/quantidade.
using System;
public static class StrWin
{
public static ArraySegment<char> Window(string s, int start, int count)
{
if (s == null) throw new ArgumentNullException("s");
if (start < 0 || count < 0 || start + count > s.Length) throw new ArgumentOutOfRangeException();
// Convert once: keep char[] for further operations
char[] buf = s.ToCharArray();
return new ArraySegment<char>(buf, start, count);
}
}
public class Program
{
public static void Main(string[] args)
{
string text = " [User: Ada] ";
ArraySegment<char> mid = StrWin.Window(text, 2, 10); // "[User: Ada]"
Console.WriteLine("Offset=" + mid.Offset + " Count=" + mid.Count);
}
}
Aparar por índices
Opere por índices para simular a lógica de Trim baseada em fatias; nenhuma nova cadeia de texto é criada.
using System;
public static class SegText
{
public static ArraySegment<char> Trim(ArraySegment<char> seg)
{
int i = seg.Offset;
int j = seg.Offset + seg.Count - 1;
while (i <= j && Char.IsWhiteSpace(seg.Array[i])) i++;
while (j >= i && Char.IsWhiteSpace(seg.Array[j])) j--;
int n = (j >= i) ? (j - i + 1) : 0;
return new ArraySegment<char>(seg.Array, i, n);
}
}
public class Program
{
public static void Main(string[] args)
{
char[] buf = " Hello, Ada ".ToCharArray();
ArraySegment<char> all = new ArraySegment<char>(buf, 0, buf.Length);
ArraySegment<char> t = SegText.Trim(all);
// Print without creating a new string
for (int k = 0; k < t.Count; k++) Console.Write(t.Array[t.Offset + k]);
Console.WriteLine();
}
}
Pesquisar dentro da janela
Crie pequenos auxiliares semelhantes a IndexOf que retornem posições relativas dentro da janela.
using System;
public static class SegSearch
{
// Find the first index of a char inside the segment; returns -1 if not found.
public static int IndexOf(ArraySegment<char> seg, char needle)
{
int end = seg.Offset + seg.Count;
for (int i = seg.Offset; i < end; i++)
if (seg.Array[i] == needle) return i - seg.Offset; // relative index
return -1;
}
}
public class Program
{
public static void Main(string[] args)
{
char[] buf = "[User: Ada]".ToCharArray();
ArraySegment<char> w = new ArraySegment<char>(buf, 0, buf.Length);
int pos = SegSearch.IndexOf(w, '/'); // 5
Console.WriteLine("pos=" + pos);
}
}
Analisar a partir da janela
Analise números diretamente a partir da janela, sem criar subtextos; retorne sucesso ou falha.
using System;
public static class SegParse
{
// Try to parse a non-negative integer from the segment; returns false on failure.
public static bool TryParseInt(ArraySegment<char> seg, out int value)
{
value = 0;
if (seg.Count == 0) return false;
int end = seg.Offset + seg.Count;
for (int i = seg.Offset; i < end; i++)
{
char c = seg.Array[i];
if (c < '0' || c > '9') return false;
int digit = (int)(c - '0');
// basic overflow-safe step for small inputs
if (value > (Int32.MaxValue - digit) / 10) return false;
value = value * 10 + digit;
}
return true;
}
}
public class Program
{
public static void Main(string[] args)
{
char[] buf = "id=1203; name=Ada".ToCharArray();
ArraySegment<char> idSeg = new ArraySegment<char>(buf, 3, 4); // "1203"
int n;
bool ok = SegParse.TryParseInt(idSeg, out n);
Console.WriteLine(ok ? ("n=" + n) : "parse failed");
}
}
Materialização na fronteira
Crie um novo texto somente na etapa final, para a interface ou o registro; mantenha o trabalho interno sem alocações.
using System;
public static class SegToString
{
public static string ToStringSegment(ArraySegment<char> seg)
{
// Materialize a new string only when needed (e.g., logging/output)
return new string(seg.Array, seg.Offset, seg.Count);
}
}
public class Program
{
public static void Main(string[] args)
{
char[] buf = " key=value ".ToCharArray();
ArraySegment<char> all = new ArraySegment<char>(buf, 0, buf.Length);
// Trim first
int i = all.Offset, j = all.Offset + all.Count - 1;
while (i <= j && Char.IsWhiteSpace(buf[i])) i++;
while (j >= i && Char.IsWhiteSpace(buf[j])) j--;
ArraySegment<char> trimmed = new ArraySegment<char>(buf, i, (j >= i) ? (j - i + 1) : 0);
// Create string only at the end
Console.WriteLine(SegToString.ToStringSegment(trimmed)); // "key=value"
}
}
Abordagem de texto como fatia
Recapitulação
Recapitulação: trate textos como fatias — trabalhe com matrizes de caracteres, use deslocamento/quantidade para aparar, pesquisar e analisar, e materialize somente quando necessário.
Perguntas Frequentes
A aula “APIs de string como Span (emulação no C# 6)” é grátis?
Sim — o texto completo de “APIs de string como Span (emulação no C# 6)” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 3 aulas no total.
O que vou aprender em “APIs de string como Span (emulação no C# 6)”?
Emule string como span: converta para char[], faça recortes com ArraySegment , pesquise, remova espaços e analise por índices e crie substrings somente nas extremidades. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 3.
Quanto tempo leva a aula “APIs de string como Span (emulação no C# 6)”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Fundamentos de Span/ReadOnlySpan (emulação no C# 6)
- Emulação de Memory/ReadOnlyMemory: janelas sem cópia
- APIs de string como Span (emulação no C# 6)