0Pricing
C# Academy · บทเรียน

API แบบสตริงเป็น Span (จำลองใน C# 6)

จำลองสตริงให้ทำงานแบบ Span: แปลงเป็น char[] แบ่งส่วนด้วย ArraySegment ค้นหา ตัดช่องว่าง และแยกวิเคราะห์ด้วยดัชนี พร้อมสร้างสตริงย่อยเฉพาะที่ขอบเขต

API แบบสตริงเป็น Span (จำลองใน C# 6) เป็นบทเรียน C# Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C# Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

แผน: ใช้สตริงเป็นช่วงย่อย

เป้าหมาย: ใช้แนวคิดการมองสตริงเป็นช่วงข้อมูลใน C# 6

  • แปลงเป็นอาร์เรย์อักขระเพียงครั้งเดียว
  • ใช้ ArraySegment<อักขระ> เป็นมุมมอง
  • ตัดแต่ง ค้นหา และแยกวิเคราะห์ตามดัชนี
  • สร้างสตริงย่อยเฉพาะที่ขอบเขต

หน้าต่างเหนือสตริง

สร้าง หน้าต่าง เหนือสตริงด้วยการแปลงเป็นอาร์เรย์อักขระเพียงครั้งเดียว จากนั้นทำงานด้วยตำแหน่งเริ่มต้น/จำนวน

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

ตัดแต่งตามดัชนี

ดำเนินการตาม ดัชนี เพื่อจำลองตรรกะการตัดแต่งข้อมูลแบบ 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"
  }
}

แนวทางใช้สตริงเป็นช่วงข้อมูล

ตรวจสอบสั้น ๆ: ใน C# 6 จะวิเคราะห์บางส่วนของสตริงโดยไม่จัดสรรหน่วยความจำเพิ่มเติมได้อย่างไร

สรุปทบทวน

สรุปทบทวน: ปฏิบัติต่อสตริงเหมือนช่วงข้อมูล ทำงานกับ หน้าต่างอาร์เรย์อักขระ ใช้ ตำแหน่งเริ่มต้น/จำนวน สำหรับการตัดแต่ง การค้นหา และการแยกวิเคราะห์ และใช้ Materialize เฉพาะเมื่อจำเป็น

คำถามที่พบบ่อย

บทเรียน “API แบบสตริงเป็น Span (จำลองใน C# 6)” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “API แบบสตริงเป็น Span (จำลองใน C# 6)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C# Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C# Academy มีบทเรียนทั้งหมด 3 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “API แบบสตริงเป็น Span (จำลองใน C# 6)”

จำลองสตริงให้ทำงานแบบ Span: แปลงเป็น char[] แบ่งส่วนด้วย ArraySegment ค้นหา ตัดช่องว่าง และแยกวิเคราะห์ด้วยดัชนี พร้อมสร้างสตริงย่อยเฉพาะที่ขอบเขต คุณปฏิบัติ C# Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C# Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C# Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 3 บทเรียน

บทเรียน “API แบบสตริงเป็น Span (จำลองใน C# 6)” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C# Academy นี้ได้ไหม

ได้ บทเรียน C# Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐาน Span/ReadOnlySpan (จำลองใน C# 6)
  2. การจำลอง Memory/ReadOnlyMemory: หน้าต่างแบบไม่คัดลอก
  3. API แบบสตริงเป็น Span (จำลองใน C# 6)
← กลับไปที่ C# Academy