0Pricing
C# Academy · Lekcja

API string jako Span (emulacja w C# 6)

Proszę emulować string jako span: konwertować do char[], wycinać fragmenty za pomocą ArraySegment , wyszukiwać, przycinać i analizować według indeksów oraz tworzyć podciągi tylko na krawędziach.

API string jako Span (emulacja w C# 6) to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 3 z 3. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 3 lekcji w sumie.

Plan: string jako wycinki

Cel: Wykorzystać idee string-as-span w C# 6.

  • Jednorazowo konwertować dane do char[]
  • Używać ArraySegment<char> jako widoku
  • Przycinać, wyszukiwać i analizować dane według indeksów
  • Tworzyć podciąg za pomocą Substring tylko na granicy

Okno na stringu

Należy utworzyć okno na stringu, jednorazowo konwertując go do char[], a następnie pracować z offset/count.

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);
  }
}

Przycinanie według indeksów

Należy operować za pomocą indeksów, aby emulować logikę Trim opartą na Span; nie jest tworzony nowy string.

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();
  }
}

Wyszukiwanie w oknie

Należy tworzyć małe pomocniki podobne do IndexOf, które zwracają pozycje względne w obrębie okna.

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);
  }
}

Analizowanie danych z okna

Należy analizować liczby bezpośrednio z okna bez tworzenia podciągów; należy zwracać informację o powodzeniu lub niepowodzeniu.

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");
  }
}

Materializacja na granicy

Należy tworzyć nowy string dopiero na ostatnim etapie (interfejs użytkownika lub logowanie); wewnętrzne operacje powinny nie powodować alokacji.

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"
  }
}

Podejście string-as-span

Szybkie sprawdzenie: Jak w C# 6 analizować część stringa bez dodatkowych alokacji?

Podsumowanie

Podsumowanie: Należy traktować stringi jak span — pracować na oknach char[], używać offset/count do przycinania, wyszukiwania i analizy oraz materializować dane tylko wtedy, gdy jest to potrzebne.

Często zadawane pytania

Czy lekcja „API string jako Span (emulacja w C# 6)” jest bezpłatna?

Tak — pełny tekst „API string jako Span (emulacja w C# 6)” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 3 lekcji w sumie.

Co nauczysz się w „API string jako Span (emulacja w C# 6)”?

Proszę emulować string jako span: konwertować do char[], wycinać fragmenty za pomocą ArraySegment , wyszukiwać, przycinać i analizować według indeksów oraz tworzyć podciągi tylko na krawędziach. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 3.

Ile czasu zajmuje lekcja „API string jako Span (emulacja w C# 6)”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Podstawy Span/ReadOnlySpan (emulacja w C# 6)
  2. Emulacja Memory/ReadOnlyMemory: okna bez kopiowania
  3. API string jako Span (emulacja w C# 6)
← Powrót do C# Academy