API «строка как Span» (эмуляция в C# 6)
Эмулируйте строку как span: преобразуйте ее в char[], выделяйте срезы с помощью ArraySegment , выполняйте поиск, обрезку и разбор по индексам и создавайте подстроки только на краях.
«API «строка как Span» (эмуляция в C# 6)» — бесплатный урок C# Academy на CoddyKit. Это урок 3 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 3 уроков всего.
План: строка как срез
Цель: использовать идеи строки как диапазона в C# 6.
- Один раз преобразуйте строку в массив символов
- Используйте ArraySegment<char> как представление
- Обрезайте, ищите и разбирайте по индексам
- Создавайте подстроку только на границе
Окно над строкой
Создайте окно над строкой, один раз преобразовав её в массив символов, а затем работайте со смещением и количеством.
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);
}
}
Обрезка по индексам
Работайте по индексам, чтобы имитировать логику Trim на основе Span; новая строка не создаётся.
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();
}
}
Поиск внутри окна
Создайте небольшие вспомогательные методы наподобие IndexOf, которые возвращают относительные позиции внутри окна.
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);
}
}
Разбор из окна
Разбирайте числа непосредственно из окна, не создавая подстрок; возвращайте признак успеха или неудачи.
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");
}
}
Материализация на границе
Создавайте новую строку только на последнем шаге (для интерфейса или журналирования); внутренние операции выполняйте без выделения памяти.
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"
}
}
Подход «строка как диапазон»
Повторение
Повторение: рассматривайте строки как диапазоны — работайте с окнами массивов символов, используйте смещение/количество для обрезки, поиска и разбора и выполняйте материализацию только при необходимости.
Часто задаваемые вопросы
Урок «API «строка как Span» (эмуляция в C# 6)» бесплатный?
Да — полный текст урока «API «строка как Span» (эмуляция в C# 6)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 3 уроков всего.
Чему я научусь в уроке «API «строка как Span» (эмуляция в C# 6)»?
Эмулируйте строку как span: преобразуйте ее в char[], выделяйте срезы с помощью ArraySegment , выполняйте поиск, обрезку и разбор по индексам и создавайте подстроки только на краях. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 3.
Сколько времени занимает урок «API «строка как Span» (эмуляция в C# 6)»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основы Span/ReadOnlySpan (эмуляция в C# 6)
- Эмуляция Memory/ReadOnlyMemory: окна без копирования
- API «строка как Span» (эмуляция в C# 6)