في 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 بدل تحويل حالة الأحرف أصلًا (راجع النصوص). ولتكبير أول حرف في كل كلمة توجد 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[] a = s.ToCharArray(); Array.Reverse(a); string r = new string(a);. ومع LINQ تفعل new string(s.Reverse().ToArray()) الشيء نفسه. كلاهما يعكس وحدات UTF-16، فقد تخرج الرموز التعبيرية وعلامات التشكيل المركّبة مشوّهة.