ל-System.String יש עשרות מתודות. העמוד הזה מכסה את אלה שעושות את רוב העבודה בקוד אמיתי, עם האפשרויות והמלכודות שחשובות. כלל אחד חל על כולן: מחרוזות הן בלתי ניתנות לשינוי, ולכן כל מתודה מחזירה מחרוזת חדשה (או ערך) ומשאירה את המקור ללא שינוי. s.Trim(); בשורה משלה לא עושה כלום; כתבו s = s.Trim();.
Split
Split מפצלת מחרוזת ל-string[] בכל מפריד:
פלט:
3
apple
banana
cherry
red/green/ blue/yellow
INFO/started/ready
שימו לב ל-" blue": Split חותכת בדיוק במפריד ושומרת רווחים. שתי אפשרויות מטפלות בניקויים הנפוצים:
פלט:
5
4
c#|dotnet|linq
key=[Subject] value=[Re: Meeting: Friday]
3
RemoveEmptyEntries משמיטה חלקים באורך אפס, אבל לא חלקים שמכילים רק רווחים (" " שרד בדוגמה). ב-.NET 5 נוספה StringSplitOptions.TrimEntries, ואפשר לשלב בין השתיים: tags.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) נותנת את התוצאה הנקייה בקריאה אחת. העברת null כמפריד מפצלת בכל רווח לבן, וזו הדרך המקובלת לפצל טקסט למילים.
פיצול לפי char בודד (Split(',')) לא דורש מערך. ההעמסות שמקבלות char יחד עם אפשרויות, או string בודד, קיימות מ-.NET Core 2.0 ואילך; הצורות עם מערך שבדוגמאות עובדות בכל מקום, כולל .NET Framework ו-Unity.
Replace
Replace מחליפה כל מופע של תו או של תת-מחרוזת:
פלט:
5551234567
555.123.4567
Cats and dogs and CATS
dogs and dogs and dogs
dogs and cats and CATS
too many spaces
ההעמסה עם ארגומנט StringComparison זמינה ב-.NET Core 2.0 ומעלה. ב-.NET Framework מבצעים החלפה בלי תלות באותיות גדולות וקטנות עם Regex.Replace(text, Regex.Escape(find), replacement, RegexOptions.IgnoreCase). החלפה ב-"" היא הדרך להסיר תווים, ושרשור של כמה קריאות Replace מתאים בהחלט לקומץ החלפות.
Contains, IndexOf, StartsWith ו-EndsWith
המתודות האלה מחפשות. Contains עונה כן או לא; IndexOf ו-LastIndexOf מחזירות מיקום, או -1 כשאין התאמה; StartsWith ו-EndsWith בודקות את הקצוות.
פלט:
True
False
True
True
8
30
28
-1
16
False
True
True
כולן תלויות באותיות גדולות וקטנות כברירת מחדל. Contains(string, StringComparison) קיימת ב-.NET Core 2.1 ומעלה; הצורה IndexOf(...) >= 0 עובדת בכל גרסה, ולכן רואים אותה בקוד ישן. IndexOfAny(new[] { ',', ';' }) מוצאת את הראשון מבין כמה תווים.
הערה על תרבויות: בלי StringComparison, המתודות StartsWith, EndsWith, IndexOf(string) ו-CompareTo משתמשות בכללים שתלויים בתרבות, בעוד ש-Contains, Replace ו-IndexOf(char) משוות באופן סידורי (ordinal). העברה מפורשת של StringComparison.Ordinal או OrdinalIgnoreCase מסירה את העמימות, וכלי ניתוח קוד ממליצים על כך.
Trim, TrimStart ו-TrimEnd
Trim מסירה רווח לבן (רווחים, טאבים, שורות חדשות) משני הקצוות. TrimStart ו-TrimEnd מסירות מקצה אחד. כשמעבירים להן תווים, הן מסירות אותם במקום:
פלט:
[ana@example.com]
[ana@example.com \n]
[ x]
SALE
7
path/to/dir
1,234.50
Trim נוגעת רק בקצוות; רווחים בתוך המחרוזת נשמרים. TrimStart('0') על "000" מחזירה מחרוזת ריקה, ולכן המירו מחרוזות של מספרים עם int.Parse במקום להסיר אפסים ידנית.
ToUpper ו-ToLower
פלט:
MAYA LOPEZ
maya lopez
MAYA LOPEZ
Coffee
ToUpper ו-ToLower פועלות לפי התרבות הנוכחית, ולכן בטורקית "i".ToUpper() היא İ גדולה עם נקודה, ולא I. למזהים, מפתחות ושמות קבצים השתמשו ב-ToUpperInvariant וב-ToLowerInvariant. להשוואה, השתמשו ב-StringComparison במקום להמיר אותיות בכלל (ראו strings). כדי להפוך את האות הראשונה של כל מילה לגדולה קיימת CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text), אבל היא לא נוגעת במילים שכבר כתובות כולן באותיות גדולות.
PadLeft ו-PadRight
ריפוד מוסיף תווים עד שהמחרוזת מגיעה לרוחב כולל. זה שימושי לפלט ברוחב קבוע ולריפוד קודים באפסים:
פלט:
000042
[Tea ]
[ Tea]
Too long already
Espresso.. 2.40
Latte..... 3.60
Mocha..... 3.95
יישור באינטרפולציה ({name,-10}) עושה את אותה עבודה בתוך השורה.
Join ו-Concat
string.Join שמה מפריד בין האיברים של כל אוסף. string.Concat מחברת בלי מפריד:
פלט:
Ana, Ben, Chloe
1 + 2 + 3
True
2026-09
AnaBenChloe
Ana, Ben and Chloe
Join היא הדרך הנכונה לבנות רשימה עם מפרידים: אין מפריד מיותר בסוף שצריך להסיר, והיא בונה את התוצאה במעבר אחד. היא קוראת ל-ToString() על כל איבר, ולכן עובדת גם עם מספרים ואובייקטים.
Reverse, Insert ו-Remove
אין מתודה string.Reverse שמחזירה מחרוזת. שתי הגישות המקובלות:
פלט:
desserts
desserts
True
2026/Q3-09
Hello
HelloWorld
word.Reverse() לבדה מחזירה IEnumerable<char>, לא מחרוזת; הדפסה שלה מציגה שם של טיפוס. שתי השיטות הופכות יחידות קוד של UTF-16, וזה שובר תווים שמורכבים משתי יחידות (רוב האמוג'י) ואותיות עם סימני הטעמה משולבים.
טבלת סיכום
| משימה | מתודה |
|---|---|
| פיצול לחלקים | s.Split(','), s.Split(new[] {',', ';'}, StringSplitOptions.RemoveEmptyEntries) |
| החלפת הכול | s.Replace("a", "b") |
| בדיקת הכלה | s.Contains("x"), s.Contains("x", StringComparison.OrdinalIgnoreCase) |
| מיקום | s.IndexOf("x"), s.LastIndexOf('x') (-1 אם לא נמצא) |
| מתחילה או מסתיימת ב- | s.StartsWith("x"), s.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase) |
| הסרת רווח לבן בקצוות | s.Trim(), s.TrimStart(), s.TrimEnd() |
| שינוי אותיות גדולות וקטנות | s.ToUpper(), s.ToLowerInvariant() |
| ריפוד לרוחב | s.PadLeft(6, '0'), s.PadRight(10) |
| חיבור אוסף | string.Join(", ", items) |
| חלק ממחרוזת | s.Substring(start, length) |
| הוספה או מחיקה | s.Insert(i, "x"), s.Remove(i, count) |
| בדיקת null או ריקה | string.IsNullOrWhiteSpace(s) |
שאלות נפוצות
איך מפצלים מחרוזת ב-C#?
text.Split(',') מחזירה string[] עם החלקים שבין הפסיקים. העבירו כמה מפרידים כמערך (Split(new[] { ',', ';' })), מפריד מסוג מחרוזת עם Split(new[] { ", " }, StringSplitOptions.None), ו-StringSplitOptions.RemoveEmptyEntries כדי להשמיט חלקים ריקים שנוצרים ממפרידים כפולים. ב-.NET 5 נוספה StringSplitOptions.TrimEntries, שמקצצת כל חלק.
איך בודקים אם מחרוזת מכילה מחרוזת אחרת בלי תלות באותיות גדולות וקטנות?
ב-.NET Core 2.1 ומעלה: text.Contains("error", StringComparison.OrdinalIgnoreCase). ב-.NET Framework, שאין בו את ההעמסה הזו, השתמשו ב-text.IndexOf("error", StringComparison.OrdinalIgnoreCase) >= 0. הימנעו מ-text.ToLower().Contains(...), שמקצה עותק ועלול להתנהג לא נכון בחלק מהתרבויות.
האם String.Replace משנה את המחרוזת המקורית ב-C#?
לא. מחרוזות הן בלתי ניתנות לשינוי, ולכן Replace מחזירה מחרוזת חדשה שבה כל המופעים הוחלפו ומשאירה את המקור כמו שהיה. כתבו s = s.Replace("old", "new");. היא מחליפה את כל המופעים, לא רק את הראשון; כדי להחליף רק את הראשון, מצאו אותו עם IndexOf ובנו את המחרוזת מחדש, או קראו ל-Replace על מופע של Regex עם מונה 1.
מה IndexOf מחזירה אם המחרוזת לא נמצאה?
-1. כל תוצאה של 0 ומעלה היא המיקום, מאפס, של ההתאמה הראשונה. בדקו תמיד אם התוצאה היא -1 לפני שמשתמשים בה כאינדקס, כי Substring(-1) זורקת חריגה ו-Substring(-1 + 1) מחזירה בשקט את כל המחרוזת. LastIndexOf עובדת באותו אופן, ומחפשת מהסוף.
איך הופכים מחרוזת ב-C#?
העתיקו אותה למערך char, הפכו את המערך ובנו מחרוזת חדשה: char[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. עם LINQ, new string(s.Reverse().ToArray()) עושה את אותו הדבר. שתי הדרכים הופכות יחידות UTF-16, ולכן אמוג'י ואותיות עם סימני הטעמה משולבים עלולים לצאת משובשים.