البرنامج التعليمي لـ C# Array: الإنشاء والإعلان والتهيئة

⚡ ملخص ذكي

تُخزّن المصفوفات في لغة C# مجموعة ثابتة الحجم من العناصر التي تشترك في نفس نوع البيانات تحت اسم متغير واحد. يوجد كل عنصر في فهرس يبدأ من الصفر، مما يجعل عملية تعريف القيم وتهيئتها والوصول إليها سريعة ويمكن التنبؤ بها.

  • 📌 فريف: تحتوي المصفوفة على قيم متعددة من نوع واحد في مواضع مفهرسة يتم الوصول إليها من خلال متغير واحد.
  • إعلان: يُعلن نوع البيانات متبوعًا بأقواس مربعة واسم عن مصفوفة، على سبيل المثال قيم Int32[] .
  • 🔢 التهيئة: تحدد الكلمة الرئيسية الجديدة الحجم، ثم يتلقى كل فهرس قيمة مثل values[0]=1.
  • 🔍 وصول: يقوم الفهرسة التي تبدأ من الصفر بقراءة أو كتابة أي عنصر، لذا فإن العنصر الأول هو values[0] ويبدأ العد من 0.
  • 🔁 تكرار: تقوم حلقة foreach بالمرور على كل عنصر بدون فهرس، مما يتجنب أخطاء خارج النطاق في المصفوفات الأكبر حجمًا.
  • 🤖 مساعدة الذكاء الاصطناعي: يقوم GitHub Copilot بإنشاء قوالب المصفوفات، بينما يقوم ML.NET بتحميل المصفوفات الرقمية كميزات لنماذج التعلم الآلي.

المصفوفات في لغة C#

ما هي المصفوفات في C#؟

يتم استخدام المصفوفة لتخزين مجموعة أو سلسلة من العناصر. وستكون هذه العناصر من نفس النوع.

على سبيل المثال، إذا كان لديك مصفوفة من القيم الصحيحة، فقد تكون المصفوفة عبارة عن مجموعة من القيم مثل [1، 2، 3، 4]. هنا عدد العناصر في المصفوفة هو 4.

تكون المصفوفات مفيدة عندما تريد تخزين مجموعة من القيم من نفس النوع. لذلك بدلاً من إعلان أ متغير لكل عنصر، يمكنك فقط إعلان متغير واحد.

سيشير هذا المتغير إلى مصفوفة أو قائمة عناصر، والتي ستكون مسؤولة عن تخزين عناصر المصفوفة.

دعونا نلقي نظرة على كيفية العمل مع المصفوفات في لغة C#. في مثالنا، سنعلن عن مجموعة من الأعداد الصحيحة ونعمل معها وفقًا لذلك.

لاحظ أنه يتم تنفيذ كافة التعليمات البرمجية أدناه إلى ملف Program.cs.

الخطوة 1) الإعلان عن مصفوفة – الخطوة الأولى هي الإعلان عن مصفوفة. دعونا نرى كيف يمكننا تحقيق ذلك من خلال المثال الكودي أدناه.

المصفوفات في لغة C#

Code تفسير:-

  1. الجزء الأول هو نوع البيانات. يحدد نوع العناصر المستخدمة في المصفوفة. لذا، في حالتنا، نقوم بإنشاء مجموعة من الأعداد الصحيحة.
  2. الجزء الثاني [ ] والذي يحدد رتبة المصفوفة. (الرتبة عبارة عن عنصر نائب يحدد عدد العناصر التي سيحتوي عليها المصفوفة)
  3. التالي هو اسم المصفوفة والتي في حالتنا هي "القيم". لاحظ أنك ترى خطًا أخضر متعرجًا تحته، فلا تقلق بشأن ذلك. هذا مجرد .Net يقول أنك قمت بتعريف مصفوفة، لكنك لا تستخدمها في أي مكان.

الخطوة 2) الخطوة التالية هي تهيئة المصفوفة. سنقوم هنا بتحديد عدد القيم التي ستحتفظ بها المصفوفة. سنقوم أيضًا بتعيين قيم لكل عنصر في المصفوفة.

المصفوفات في لغة C#

Code تفسير:-

  1. أولاً، نقوم بتعيين عدد العناصر التي سيحتويها المصفوفة إلى 3. لذا، بين الأقواس المربعة، نقول إن المصفوفة ستحتوي على 3 عناصر.
  2. ثم نقوم بتعيين قيم لكل عنصر من عناصر المصفوفة. يمكننا فعل ذلك بتحديد اسم المتغير متبوعًا بموقعه في المصفوفة. لذا، فإن values[0] تعني أننا نخزن قيمة في الموضع الأول من المصفوفة. وبالمثل، للوصول إلى الموضع الثاني، نستخدم الصيغة values[1] وهكذا.

ملاحظات: – في المصفوفات، يبدأ موضع الفهرس من 0.

الخطوة 3) دعونا الآن نعرض العناصر الفردية للمصفوفة في وحدة التحكم. دعونا نضيف الكود أدناه لتحقيق ذلك.

المصفوفات في لغة C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args) 
  {
   Int32[] value;
   value=new Int32[3];
   
   value[0]=1;
   value[1]=2;
   value[2]=3;
   
   Console.WriteLine(value[0]);
   Console.WriteLine(value[1]);
   Console.WriteLine(value[2]);
    
   Console.ReadKey(); 
  }
 }
}

Code تفسير:-

هذا هو الجزء البسيط حيث نستخدم فقط طريقة Console.WriteLine لإرسال كل قيمة للعنصر إلى وحدة التحكم.

لاحظ أننا نصل مرة أخرى إلى كل عنصر بمساعدة اسم متغير المصفوفة بالإضافة إلى موضع الفهرس.

إذا تم إدخال الكود أعلاه بشكل صحيح وتم تنفيذ البرنامج، سيتم عرض الإخراج التالي.

الإخراج:

المصفوفات في لغة C#

من خلال الإخراج، يمكنك رؤية جميع قيم المصفوفة المعروضة في وحدة التحكم.

كيفية تكرار عناصر مصفوفة في لغة C# باستخدام حلقة foreach

قراءة كل عنصر باستخدام فهرسه أمرٌ ممكن، لكنه يصبح مُرهقًا عندما تحتوي المصفوفة على العديد من القيم. توفر حلقة foreach طريقةً أنظف لزيارة كل عنصر من عناصر المصفوفة بالترتيب دون الحاجة إلى قراءة كل عنصر. tracقم بإنشاء متغير فهرس بنفسك.

تأخذ عبارة foreach كل عنصر من عناصر المصفوفة واحدًا تلو الآخر وتنسخه إلى متغير الحلقة. ثم تستخدم هذا المتغير داخل جسم الحلقة. ولأن الحلقة تتوقف تلقائيًا عند العنصر الأخير، فإن foreach تزيل خطر قراءة عناصر تتجاوز نهاية المصفوفة.

using System;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   Int32[] values = new Int32[3] {1, 2, 3};
   foreach (Int32 item in values)
   {
    Console.WriteLine(item);
   }
   Console.ReadKey();
  }
 }
}

يُعلن المثال أعلاه عن مصفوفة من ثلاثة أعداد صحيحة ويُهيئها، ثم يمر عليها باستخدام حلقة foreach. في كل مرة يمرر المتغير بند يستقبل القيمة التالية، ثم يقوم Console.WriteLine بطباعتها. ويكون الناتج هو الأرقام 1 و2 و3 على أسطر منفصلة.

أهم النقاط التي يجب تذكرها حول استخدام حلقة foreach مع المصفوفات:

  • متغير الحلقة للقراءة فقط، لذا فإن foreach هو الأفضل لقراءة القيم بدلاً من تغييرها في مكانها.
  • لتعديل العناصر أثناء البحثpingاستخدم حلقة تكرارية مع فهرس بدلاً من ذلك.
  • تعمل حلقة foreach مع المصفوفات أحادية البعد، والمصفوفات متعددة الأبعاد، وأي مجموعة تدعم التكرار.

المصفوفات متعددة الأبعاد في لغة C#

المصفوفات المعروضة حتى الآن أحادية البعد، أي أنها تخزن قائمة بسيطة من القيم. يدعم C# أيضًا المصفوفات متعددة الأبعاد، التي ترتب العناصر في شبكة من الصفوف والأعمدة. تُعد المصفوفة ثنائية الأبعاد الشكل الأكثر شيوعًا، وهي مناسبة لبيانات مثل المصفوفات، ولوحات الألعاب، والجداول.

يمكنك تعريف مصفوفة ثنائية الأبعاد بوضع فاصلة داخل الأقواس المربعة. كل فاصلة إضافية تضيف بُعدًا آخر، لذا فإن int[,] ثنائية الأبعاد و int[,,] ثلاثية الأبعاد. يتم الوصول إلى العناصر باستخدام فهرس واحد لكل بُعد.

using System;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   int[,] matrix = new int[2, 2] { {1, 2}, {3, 4} };
   Console.WriteLine(matrix[0, 0]);
   Console.WriteLine(matrix[1, 1]);
   Console.ReadKey();
  }
 }
}

تحتوي المصفوفة هنا على صفين وعمودين. تُرجع الدالة matrix[0, 0] القيمة 1، بينما تُرجع الدالة matrix[1, 1] القيمة 4. يتم تحديد عدد الأبعاد عند تعريف المصفوفة، بينما يتم تحديد حجم كل بُعد عند إنشاء المصفوفة.

المصفوفات غير المنتظمة في لغة C#

المصفوفة غير المنتظمة هي مصفوفة تتكون عناصرها من مصفوفات أخرى. على عكس المصفوفة متعددة الأبعاد المستطيلة، يمكن أن يكون لكل مصفوفة داخلية طول مختلف، ولهذا السبب تُسمى المصفوفة غير المنتظمة غالبًا بمصفوفة المصفوفات. تُفيد هذه المرونة عندما تحتوي الصفوف بطبيعتها على أعداد مختلفة من القيم.

تقوم بتعريف مصفوفة غير منتظمة باستخدام مجموعتين من الأقواس المربعة، ثم تُنشئ كل مصفوفة داخلية على حدة. يُنشئ المثال التالي مصفوفة غير منتظمة حيث يحتوي الصف الأول على ثلاث قيم، بينما يحتوي الصف الثاني على قيمتين.

using System;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   int[][] jagged = new int[2][];
   jagged[0] = new int[] {1, 2, 3};
   jagged[1] = new int[] {4, 5};
   Console.WriteLine(jagged[0][2]);
   Console.WriteLine(jagged[1][1]);
   Console.ReadKey();
  }
 }
}

يقرأ التعبير jagged[0][2] العنصر الثالث من الصف الأول، وهو 3، ويقرأ التعبير jagged[1][1] العنصر الثاني من الصف الثاني، وهو 5. ولأن كل صف عبارة عن مصفوفة منفصلة، ​​فإن المصفوفات المتعرجة تستخدم الذاكرة بكفاءة عندما تختلف أطوال الصفوف، على الرغم من أنها تحتاج إلى خطوة إضافية لتهيئة كل مصفوفة داخلية.

الأسئلة الشائعة

تُعيد الخاصية Length العدد الإجمالي للعناصر في مصفوفة C#. على سبيل المثال، تُعيد values.Length القيمة 3 لمصفوفة تحتوي على ثلاثة عناصر. أما بالنسبة للمصفوفات متعددة الأبعاد، فتُعيد GetLength(dimension) حجم كل بُعد على حدة.

تتميز مصفوفة AC# بحجم ثابت يُحدد عند إنشائها، بينما تنمو القائمة وتتقلص ديناميكيًا. تُعد المصفوفات أسرع للبيانات الثابتة وتستهلك موارد أقل، في حين أن القائمة مناسبة للمجموعات التي يتغير عدد عناصرها أثناء التشغيل.

تُخزّن المصفوفة القياسية في لغة C# عناصر من نوع واحد مُعلن عنه، لذا لا يُسمح بخلط الأنواع. لتخزين أنواع مختلفة، يُمكنك تعريف مصفوفة من نوع object[] أو استخدام مجموعة مثل ArrayList، مع العلم أن كلا الخيارين يُؤثر سلبًا على سلامة النوع أثناء الترجمة.

تقوم الدالة الثابتة Array.Sort بترتيب عناصر مصفوفة C# ترتيبًا تصاعديًا في مكانها. مرر المصفوفة إلى Array.Sort(values)، ثم استخدم Array.Reverse ثم ترتيبها تنازليًا. تعمل عملية الفرز على الأرقام والسلاسل النصية والأنواع الأخرى المشابهة.

تقوم الدالة Array.Copy بنسخ نطاق من العناصر من مصفوفة إلى أخرى، بينما تقوم الدالة Clone بإنشاء نسخة سطحية من المصفوفة بأكملها. إن إسناد قيمة لمتغير مصفوفة إلى آخر ينسخ المرجع فقط، وليس العناصر الأساسية.

يحدث استثناء IndexOutOfRangeException عندما يحاول البرنامج الوصول إلى عنصر في مصفوفة غير موجود، مثل values[5] في مصفوفة مكونة من ثلاثة عناصر. ولأن مصفوفات C# تبدأ من الصفر، فإن الفهارس الصحيحة تتراوح من 0 إلى طول المصفوفة ناقص واحد. لذا، تحقق دائمًا من صحة الفهرس قبل استخدامه.

نعم. يقترح GitHub Copilot تعريفات المصفوفات، وتهيئتها، ومنطق الحلقات من تعليق أو اسم دالة داخل Visual Studio و VS Code. Revراجع كل اقتراح لتحديد الحجم الصحيح وحدود الفهرس، حيث يمكن أن يتسبب Copilot في أخطاء بمقدار واحد وأخطاء خارج النطاق.

تمثل ML.NET متجهات الميزات ومدخلات النموذج كمصفوفات C#، عادةً ما تكون من نوع float[] . يتم تحميل بيانات التدريب في مصفوفات أو نطاقات، وتُرجع التنبؤات مصفوفات من النتائج. الحجم الثابت وسرعة فهرسة المصفوفات يجعلانها فعالة في مسارات التعلم الآلي.

تلخيص هذه التدوينة بـ: