كيفية تكرار الأحرف بشكل صحيح في C#: من الكود الساذج إلى التحسين

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا أصبح سؤال تكرار الحرف أيقونياً

\n\n

إذا كنت قد كتبت يوماً ما بلغة C#، فبالتأكيد واجهت المهمة: "أحتاج إلى إنشاء سلسلة نصية مكونة من N من الأحرف المتطابقة". قد يبدو الأمر بسيطاً، أليس كذلك؟ لكن هذا السؤال تحديداً على Stack Overflow حصد آلاف المشاهدات وعشرات الإجابات. لماذا؟ لأن وراء البساطة الظاهرية يكمن عالم كامل من تحسين الأداء والمزالق الخفية.

\n\n

في هذه المقالة، لن نعرض فقط كيفية تكرار حرف في C#. بل سننتقل من الحل الساذج إلى التقنيات الاحترافية المستخدمة في الأنظمة عالية التحميل. ستتعرف على الطريقة الأفضل لتكرار الحرف في سيناريوهات مختلفة، ولماذا بعض النصائح الشائعة هي في الواقع ضارة.

\n\n

لمن ستكون هذه المقالة مفيدة؟

\n
    \n
  • لمطوري C# المبتدئين الذين يريدون كتابة كود ليس فقط فعالاً بل فعالاً من حيث الأداء
  • \n
  • للمبرمجين ذوي الخبرة الذين يبحثون عن طرق لتحسين عمليات السلاسل النصية
  • \n
  • لكل من يستعد لمقابلات تقنية ويريد التألق بمعرفة البنية الداخلية لـ .NET
  • \n
\n\n

المشكلة: لماذا لا يجب استخدام حلقة for

\n\n

عندما يسمع المبتدئ "كرر الحرف N مرة"، أول ما يتبادر إلى ذهنه هو حلقة for:

\n\n
string RepeatChar(char c, int count)\n{\n    string result = "";\n    for (int i = 0; i < count; i++)\n        result += c;\n    return result;\n}\n
\n\n

هذا الحل يعمل، لكنه بطيء جداً. لماذا؟ لأن السلاسل النصية في C# غير قابلة للتغيير. كل عملية += تنشئ سلسلة جديدة، وتنسخ المحتوى القديم بالإضافة إلى حرف واحد. ونتيجة لذلك، فإن تعقيد هذه الخوارزمية هو O(n²). بالنسبة لـ 10 أحرف، هذا غير ملحوظ، لكن بالنسبة لـ 100,000 حرف، يصبح أبدياً.

\n\n

دعنا نلقي نظرة على الأرقام الحقيقية. اختبرنا هذه الطريقة مع count = 100,000. على معالج حديث، سيستغرق هذا... عدة ثوانٍ. وماذا لو احتجنا لتكرار الحرف مليون مرة؟ سيتجمد البرنامج ببساطة.

\n\n

الخلاصة: الحلقة مع التسلسل النصي هي شر. لكن هناك طرق أخرى أكثر فعالية.

\n\n

الطرق الرئيسية لتكرار حرف في C#

\n\n

دعنا نستعرض جميع الطرق الشائعة التي تتم مناقشتها على Stack Overflow وفي المشاريع الحقيقية. سنختبر أداء كل منها ونحلل متى نستخدم أي منها.

\n\n

1. StringBuilder الكلاسيكي

\n\n

الخطوة الأولى نحو التحسين هي استخدام StringBuilder. فهو لا ينشئ سلسلة جديدة مع كل إضافة، بل يعمل مع مخزن مؤقت:

\n\n
string RepeatWithStringBuilder(char c, int count)\n{\n    StringBuilder sb = new StringBuilder(count);\n    for (int i = 0; i < count; i++)\n        sb.Append(c);\n    return sb.ToString();\n}\n
\n\n

لاحظ: لقد حددنا السعة الأولية count على الفور. هذا مهم! إذا لم تحدد السعة، فسيضطر StringBuilder إلى إعادة توزيع الذاكرة عدة مرات، مما يقلل الأداء.

\n\n

الأداء: O(n). بالنسبة لـ 100,000 حرف، تعمل هذه الطريقة في ~1-2 مللي ثانية.

\n\n

2. مصفوفة الأحرف + new string

\n\n

وهذه هي واحدة من أسرع الطرق في .NET. نقوم بإنشاء مصفوفة بالطول المطلوب، ونملؤها بالحرف، ثم نمررها إلى مُنشئ السلسلة:

\n\n
string RepeatWithArray(char c, int count)\n{\n    char[] chars = new char[count];\n    Array.Fill(chars, c);\n    return new string(chars);\n}\n
\n\n

لماذا هذا سريع؟ لأننا نعمل مباشرة مع الذاكرة: يتم ملء المصفوفة في مسار واحد، ومُنشئ new string(char[]) ينسخ البيانات ببساطة إلى المخزن المؤقت الداخلي للسلسلة. لا توجد عمليات إضافية.

\n\n

الأداء:

المدونات

توصيات الكتب