القوائم في C#

القوائم List هي نوع من أنواع البيانات الشائعة الاستخدام في لغة C#.
وتتميز القوائم عن أنواع البيانات الأخرى مثل المصفوفات بمرونتها وسهولة التحكم فيها.
فهي ديناميكية, أي أنها لا تحتاج لتحديد الحجم, كما أنها تدعم إضافة البيانات ومسحها والبحث عنها وإدارتها بكل سهولة.
وكما هو الحال في المصفوفات, تتم عملية تخزين المتغيرات في القوائم على شكل جداول.
وكل متغير له رقمه الخاص في الجدول index حيث يتم الوصول إلى هذا المتغير في الجدول عن طريق رقمه مباشرة.
تعريف القوائم List
لتعريف قائمة List, أول شيء يجب القيام به هو استدعاء مجال الأسماء System.Collections.Generic;
تدعم القوائم كل أنواع البيانات كالسلاسل النصية string وكل الأرقام الصحيحة مثل int وكل الأرقام العشرية مثل double والقيم المنطقية bool وكذا بقية الأنواع المركبة الأخرى.
ويمكن تعريف القوائم بدون ملئها بالبيانات, كما يمكن تعريفها وملؤها بالبيانات في نفس الوقت.
لنلاحظ بعض الأمثلة:
using System;
using System.Collections.Generic;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List(); // قائمة من نوع أرقام لا تحتوي على أي قيم
List names = new List(); // قائمة من نوع سلاسل نصية لا تحتوي على أي قيم
List degrees = new List { 15.4, 18.2, 42.0, 21.6 }; // قائمة من نوع أرقام عشرية معبأة ب4 قيم
List values = new List { true, false, false, true, true }; // قائمة من نوع قيم منطقية معبأة ب5 قيم
    }
  }
}
طباعة البيانات من القوائم
تتم طباعة البيانات من القوائم إما باستخدام الحلقات التكرارية المشروحة في الدروس السابقة, أو من خلال الفهرس الخاص بها.
نُذَكِر هنا أن الفهرس يبدأ من 0 أي أن القيمة الأولى في القائمة فهرسها 0, والقيمة الثانية فهرسها 1 وهكذا دواليك إلى نهاية القائمة.
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List names = new List { "Mohamad", "Anas", "Sara", "Ali", "Salim" };
Console.WriteLine(names[0]); // الناتج Mohamad
Console.WriteLine(names[1]); // الناتج Anas
Console.WriteLine(names[4]); // الناتج Salim
    }
  }
}
التعرف على طول القوائم من خلال خاصية Count
يمكننا التعرف على طول أي قائمة باستخدام خاصية Count كما هو مبين في المثال التالي:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List names = new List { "Mohamad", "Anas", "Sara", "Ali", "Salim" };
Console.WriteLine(names.Count); // الناتج 5
    }
  }
}
إضافة البيانات إلى القوائم
الإضافة إلى نهاية القائمة
تتم إضافة البيانات إلى نهاية القوائم سواء المعبأة مسبقا أو الفارغة باستعمال دالة Add.
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List();
x.Add(2); // إضافة القيمة 2 إلى القائمة x
x.Add(3); // إضافة القيمة 3 إلى القائمة x
x.Add(5); // إضافة القيمة 5 إلى القائمة x
x.Add(7); // إضافة القيمة 7 إلى القائمة x
    }
  }
}
إضافة القيم إلى فهرس محدد في القائمة
لإدخال القيم في فهرس محدد في القوائم نستخدم دالة insert, والتي تتطلب منا أن ندخل الفهرس الذي سيشغله العنصر الذي نريد إدراجه, إضافة إلى العنصر نفسه.
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List {2, 3, 5, 7, 9 };
x.Insert(0, 199); // إضافة العنصر 199 إلى الفهرس 0 في القائمة
x.Insert(2, 10); // إضافة العنصر 10 إلى الفهرس 2 في القائمة
// طباعة العناصر لملاحظة الفرق
            foreach (int i in x)
            {
                Console.WriteLine(i);
            }
    }
  }
}
الناتج:
199
2
10
3
5
7
9
مسح البيانات من القوائم
يمكننا مسح عنصر واحد من القوائم باستخدام دالة remove, كما يمكننا تفريغ القائمة من كل العناصر باستخدام دالةة clear.
دالة remove
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List {2, 3, 5, 7, 9 };
x.Remove(9); // مسح العنصر 9 من القائمة
x.Remove(2); // مسح العنصر 2 من القائمة
// طباعة العناصر لملاحظة الفرق
            foreach (int i in x)
            {
                Console.WriteLine(i);
            }
    }
  }
}
الناتج:
3
5
7
دالة clear
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List {2, 3, 5, 7, 9 };
x.Clear(); // مسح كل عناصر القائمة
// طباعة طول القائمة لملاحظة الفرق
                Console.WriteLine(x.Count);
    }
  }
}
الناتج
0
البحث في القوائم
يمكننا البحث في القوائم من خلال عدة طرق وباستخدام عدة دوال, فمثلا يمكننا البحث عن القيم من خلال الفهرس الخاص بها كما رأينا آنفا في هذا الدرس, كما يمكننا البحث باستعمال مجموعة من الدوال من بينها: Contains, و Find, و IndexOf, الخ.
دالة IndexOf
يتم استخدام دالة IndexOf لمعرفة فهرس عنصر محدد في القائمة, وهي ترجع متغيرا رقميا, كما أنه يجب الانتباه إلى أن الحساب يبدأ من 0 وليس من 1.
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List {2, 3, 5, 7, 9 };
                Console.WriteLine(x.IndexOf(9)); // الناتج هو 4
List y = new List {"A", "B:, "C", "D" };
                Console.WriteLine(y.IndexOf("C")); // الناتج هو 2
    }
  }
}
دالة Contains
يتم استخدام دالة Contains للتحقق من وجود عنصر ما في القائمة, وهي ترجع متغير من نوع bool, أي أن الناتج إما يكون true إذا كان العنصر يوجد بالفعل في القائمة, أو false إذا كان العنصر غير موجود في القائمة.
مثال:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Example
{
  class Program
  {
    static void Main(string[] args)
    {
List x = new List {2, 3, 5, 7, 9 };
                Console.WriteLine(x.Contains(5)); // الناتج هو true
                Console.WriteLine(x.Contains(19)); // الناتج هو false
    }
  }
}
في الختام, يمكن القول أن القوائم تعتبر من أهم أنواع البيانات في لغة C#, فهي تمكننا من القيام بعدة عمليات من خلال الدوال التي تطرقنا إليها في هذا الدرس, وكذا مجموعة أخرى من الدوال المتقدمة سنخصص لها درسا منفصلا في قادم الأيام, خصوصا أنها تعتمد على عبارات Lambda (Lambda Expression).