المصفوفات (Arrays) في لغة سي شارب #C
تُعتبر المصفوفات (Arrays) من البنى الأساسية والهامة في معظم لغات البرمجة، ولغة سي شارب #C ليست استثناءً. فهي تمثل مجموعة مرتبة من العناصر المتشابهة في النوع، تُخزن في مواقع متجاورة من الذاكرة، ويمكن الوصول إليها باستخدام مؤشر رقمي (فهرس). إن فهم آلية عمل المصفوفات واستخدامها بشكل فعّال يمثل جزءاً أساسياً لأي مبرمج يسعى لإتقان لغة سي شارب، خاصة مع تزايد الحاجة لمعالجة مجموعات البيانات بكفاءة في التطبيقات البرمجية الحديثة.
في هذا المقال سنقوم بشرح شامل وعميق عن المصفوفات في لغة سي شارب، بدءاً من المفاهيم الأساسية، مروراً بتصنيف أنواعها، وطرق إنشائها، وصولاً إلى العمليات المتقدمة التي يمكن تنفيذها عليها، إضافة إلى استعراض الأداء وتأثير استخدام المصفوفات على إدارة الذاكرة. كما سنتناول أفضل الممارسات في كتابة برامج تستخدم المصفوفات بفعالية، مع شرح تفصيلي للأمثلة التطبيقية.
مفهوم المصفوفات (Arrays)
المصفوفة هي هيكل بيانات يُستخدم لتخزين مجموعة من العناصر المتشابهة في النوع، مثل مجموعة أعداد صحيحة أو مجموعة نصوص أو أي نوع بيانات آخر. ما يميز المصفوفة هو ترتيب العناصر وتخزينها المتجاور في الذاكرة، الأمر الذي يتيح الوصول السريع إلى أي عنصر عن طريق استخدام مؤشر الفهرس الخاص به.
في لغة سي شارب، يتم تعريف المصفوفة بشكل عام باستخدام نوع البيانات متبوعاً بعلامة الأقواس المربعة []. على سبيل المثال، لتعريف مصفوفة من الأعداد الصحيحة:
csharpint[] numbers;
يشير هذا التعريف إلى أن numbers ستكون مصفوفة تحتوي على عناصر من النوع int. لكن هذا لا يعني أنه تم تخصيص مساحة في الذاكرة بعد، وإنما يجب إنشاء المصفوفة باستخدام الكلمة المفتاحية new وتحديد حجمها.
إنشاء المصفوفات في سي شارب
تتميز لغة سي شارب بمرونة في طرق إنشاء المصفوفات، حيث يمكن تهيئتها بعدة طرق حسب الحاجة:
1. إنشاء مصفوفة بحجم معين
يتم تحديد حجم المصفوفة أثناء الإنشاء باستخدام الكلمة المفتاحية new:
csharpint[] numbers = new int[5];
هنا يتم إنشاء مصفوفة numbers تحتوي على 5 عناصر من النوع int، ويكون كل عنصر مهيأ بقيمة الصفر الافتراضية للنوع الصحيح.
2. إنشاء مصفوفة مع تعيين قيم مباشرة
يمكن تهيئة المصفوفة بقيم محددة مباشرة عند تعريفها:
csharpint[] primes = new int[] { 2, 3, 5, 7, 11 };
أو يمكن الاستغناء عن كلمة new في هذه الحالة:
csharpint[] primes = { 2, 3, 5, 7, 11 };
تسمح هذه الطريقة بإنشاء مصفوفة تحتوي على خمسة أعداد أولية مباشرة.
3. المصفوفات متعددة الأبعاد
تدعم سي شارب إنشاء مصفوفات بأكثر من بعد واحد، مثل المصفوفات الثنائية الأبعاد التي تشبه الجداول:
csharpint[,] matrix = new int[3, 4];
تحتوي هذه المصفوفة على 3 صفوف و4 أعمدة، ويمكن الوصول إلى أي عنصر باستخدام إحداثيات الصف والعمود:
csharpmatrix[0, 1] = 5;
4. مصفوفات المصفوفات (Jagged Arrays)
نوع آخر من المصفوفات هو “مصفوفة المصفوفات” أو jagged arrays، حيث كل عنصر منها هو مصفوفة أخرى يمكن أن تختلف أطوالها:
csharpint[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[2];
jaggedArray[1] = new int[4];
jaggedArray[2] = new int[3];
تمتاز هذه المصفوفات بالمرونة في تخزين بيانات غير منتظمة الحجم، وتستخدم بشكل واسع في التطبيقات التي تتطلب معالجة بيانات غير متجانسة.
الوصول إلى عناصر المصفوفة والتعامل معها
بعد إنشاء المصفوفة، يمكن التفاعل مع عناصرها من خلال مؤشر الفهرس، حيث يبدأ الترقيم من الصفر (Indexing starts at zero).
الوصول إلى عنصر معين
للوصول إلى عنصر معين في المصفوفة أحادية البعد:
csharpint firstPrime = primes[0]; // القيمة 2
وفي المصفوفة متعددة الأبعاد:
csharpint value = matrix[2, 3];
تعديل عنصر في المصفوفة
يمكن تعديل أي عنصر عبر الفهرس مباشرة:
csharpprimes[2] = 13;
التكرار على عناصر المصفوفة
عادةً ما يتم استخدام الحلقات من نوع for أو foreach لمعالجة عناصر المصفوفة:
csharpfor (int i = 0; i < primes.Length; i++)
{
Console.WriteLine(primes[i]);
}
foreach (int prime in primes)
{
Console.WriteLine(prime);
}
الخاصية Length تعيد عدد العناصر في المصفوفة.
العمليات الأساسية على المصفوفات
يوفر إطار عمل .NET مجموعة من الأدوات والطرق التي تسهل التعامل مع المصفوفات، ومنها:
نسخ المصفوفات
يمكن نسخ محتويات مصفوفة إلى أخرى باستخدام Array.Copy:
csharpint[] source = { 1, 2, 3 };
int[] destination = new int[3];
Array.Copy(source, destination, source.Length);
ترتيب المصفوفة
يمكن ترتيب عناصر المصفوفة تصاعدياً أو تنازلياً باستخدام Array.Sort:
csharpArray.Sort(primes);
ولترتيب تنازلي يمكن عكس المصفوفة بعد الفرز:
csharpArray.Reverse(primes);
البحث داخل المصفوفة
تُستخدم Array.IndexOf لإيجاد أول ظهور لقيمة معينة:
csharpint index = Array.IndexOf(primes, 7);
المصفوفات متعددة الأبعاد والتعقيدات المرتبطة بها
الفرق بين المصفوفات متعددة الأبعاد و Jagged Arrays
-
المصفوفات متعددة الأبعاد (مثل
int[,]) تخزن البيانات في هيكل ثابت ذو أبعاد متساوية، يشبه الجدول. -
Jagged arrays (مثل
int[][]) هي مصفوفة من المصفوفات، مما يتيح صفوفًا بأطوال مختلفة.
هذا الاختلاف يؤثر على الأداء وطريقة التخزين في الذاكرة، حيث أن المصفوفات متعددة الأبعاد تخزن بشكل متسلسل ومباشر، أما Jagged arrays فتخزن كمصفوفات مستقلة ومشتركة كمؤشرات.
مثال على التعامل مع المصفوفات متعددة الأبعاد
csharpint[,] grid = new int[3, 3];
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
grid[i, j] = i + j;
}
}
الأداء وإدارة الذاكرة
المصفوفات في لغة سي شارب تدار من قبل بيئة CLR (Common Language Runtime)، وهي تستخدم ذاكرة متجاورة مما يساعد في تحسين الأداء خاصة عند التعامل مع كميات كبيرة من البيانات.
-
عند إنشاء مصفوفة، يتم تخصيص مساحة في الذاكرة الكومة (Heap) لحجم المصفوفة.
-
تتم إدارة طول المصفوفة بشكل ثابت بعد الإنشاء، حيث لا يمكن تغيير حجمها بدون إنشاء مصفوفة جديدة.
-
إذا كان المطلوب هو تعديل الحجم ديناميكياً، فغالباً ما يستخدم المبرمجون هياكل بيانات مثل
Listالتي توفر مرونة أكثر.
يجب الانتباه إلى أن المصفوفات الكبيرة قد تؤدي إلى استهلاك كبير للذاكرة، لذا من الضروري التخطيط الجيد لحجم المصفوفة أثناء التصميم.
المصفوفات والقيم الافتراضية للعناصر
عند إنشاء مصفوفة في سي شارب، يتم تهيئة عناصرها بالقيم الافتراضية لنوع البيانات:
| نوع البيانات | القيمة الافتراضية |
|---|---|
int |
0 |
double |
0.0 |
bool |
false |
char |
‘\0’ (الحرف الفارغ) |
string أو المرجعيات |
null |
هذا السلوك يساعد على تجنب القيم غير المعينة ويمنع حدوث أخطاء عند استخدام عناصر غير مهيأة.
استخدام المصفوفات مع أنواع البيانات المرجعية
المصفوفات يمكن أن تخزن أنواع بيانات مرجعية (مثل الكائنات)، وفي هذه الحالة تخزن المصفوفة مراجع إلى تلك الكائنات.
مثال:
csharpclass Person
{
public string Name { get; set; }
}
Person[] people = new Person[3];
people[0] = new Person { Name = "أحمد" };
people[1] = new Person { Name = "ليلى" };
people[2] = new Person { Name = "سارة" };
في هذا المثال، المصفوفة people تحتوي على مراجع لكائنات Person المختلفة.
التعامل مع المصفوفات في بيئة LINQ
لغة سي شارب توفر دعمًا قويًا من خلال مكتبة LINQ (Language Integrated Query) والتي تتيح تنفيذ عمليات معقدة على المصفوفات بكود مختصر وواضح.
على سبيل المثال:
csharpint[] numbers = { 1, 2, 3, 4, 5, 6 };
// استخراج الأعداد الزوجية فقط
var evenNumbers = numbers.Where(n => n % 2 == 0);
// حساب مجموع الأعداد
int sum = numbers.Sum();
تساعد LINQ على تحويل المصفوفات إلى مجموعات بيانات يمكن استعلامها ومعالجتها بطرق متعددة، مما يعزز من قدرات البرمجة على البيانات.
خلاصة مقارنة بين المصفوفات وأنواع أخرى من الهياكل
| الميزة | المصفوفات (Arrays) | List |
LinkedList |
|---|---|---|---|
| الحجم | ثابت | ديناميكي | ديناميكي |
| السرعة | عالية (الوصول المباشر) | جيدة | أقل (تتابع العناصر) |
| سهولة الاستخدام | بسيطة | مرنة | معقدة نسبياً |
| استهلاك الذاكرة | أقل | أعلى قليلاً | أعلى بسبب المؤشرات |
| الاستخدام الأمثل | مع البيانات ذات الحجم الثابت | مع البيانات ذات الحجم المتغير | في حالات الإدراج والحذف المتكرر |
جدول يوضح الفرق بين المصفوفات متعددة الأبعاد والمصفوفات المتعرجة
| الخاصية | المصفوفة متعددة الأبعاد (Multidimensional Array) | المصفوفة المتعرجة (Jagged Array) |
|---|---|---|
| التركيب | مصفوفة ذات أبعاد متساوية وثابتة | مصفوفة من مصفوفات بأطوال غير متساوية |
| طريقة الوصول | array[i, j] |
array[i][j] |
| الأداء | أسرع في الوصول للبيانات المرتبة | أقل سرعة بسبب مؤشرات متعددة |
| مرونة الحجم | حجم ثابت للأبعاد | مرونة في أطوال الصفوف المختلفة |
| تخزين الذاكرة | متجاورة في الذاكرة | مؤشرات إلى مواقع مختلفة |
نصائح وممارسات عند استخدام المصفوفات في سي شارب
-
حدد حجم المصفوفة بشكل دقيق لتجنب الهدر في الذاكرة.
-
استخدم المصفوفات متعددة الأبعاد عندما تحتاج إلى تنظيم بيانات على شكل جدول منتظم.
-
استخدم المصفوفات المتعرجة عند الحاجة إلى صفوف بأطوال مختلفة.
-
للاستعمال الديناميكي، استعن بهياكل البيانات مثل
List. -
استفد من LINQ للقيام بعمليات فلترة، ترتيب، وتجميع بكود مختصر وواضح.
-
تجنب تجاوز حدود المصفوفة (IndexOutOfRangeException) عبر التأكد من الفهارس قبل الوصول للعناصر.
-
راقب أداء التطبيقات التي تستخدم مصفوفات كبيرة وتأكد من إدارة الذاكرة بشكل جيد.
مصادر ومراجع
-
Microsoft Docs: Arrays (C# Programming Guide)
https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/arrays/ -
Jon Skeet, C# in Depth, Manning Publications, 2019
تُعتبر المصفوفات في لغة سي شارب أداة أساسية لا غنى عنها في تطوير البرمجيات، لما توفره من بنية بيانات بسيطة وفعالة تخدم أغلب احتياجات تخزين ومعالجة المجموعات المرتبة من البيانات. مع توافر إمكانيات متقدمة كالمصفوفات متعددة الأبعاد، والمصفوفات المتعرجة، ودعم LINQ، يصبح التعامل مع البيانات أسهل وأسرع، ما يرفع من جودة وأداء التطبيقات البرمجية.

