0Pricing
C# Academy · درس

استخدام List عمليًا

أضف العناصر وأزلها وابحث عنها

استخدام List عمليًا درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

لماذا List<T>؟

تُعد List<T> المصفوفة الديناميكية اليومية في C#. وتوجد في System.Collections.Generic، كما تنمو تلقائيًا عند إضافة العناصر.

وعلى عكس المصفوفة العادية، لا تحتاج إلى تحديد حجم ثابت مسبقًا. وهي آمنة الأنواع؛ فلا تحتوي List<int> إلا على قيم من النوع int، ويُكتشف ذلك في وقت الترجمة.

using System.Collections.Generic;

List<int> scores = new List<int>();
scores.Add(90);
scores.Add(85);

الإنشاء والتهيئة

يمكنك ملء القائمة فورًا باستخدام مهيئ مجموعة. وهذا الأسلوب موجز وسهل القراءة.

يحوّل المصرّف كل إدخال خلف الكواليس إلى استدعاء Add، لذا تكون النتيجة مطابقة لإضافة العناصر واحدًا تلو الآخر.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var fruits = new List<string> { "apple", "pear", "plum" };
        Console.WriteLine(fruits.Count);
    }
}

الفهرسة وCount

يمكنك الوصول إلى العناصر باستخدام فهرس يبدأ من الصفر، تمامًا كما في المصفوفة. ويمثل list[0] العنصر الأول.

استخدم Count، وليس Length، لمعرفة عدد العناصر التي تحتويها القائمة. وتستغرق القراءة أو الكتابة باستخدام الفهرس وقتًا ثابتًا O(1).

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 10, 20, 30 };
        Console.WriteLine(nums[1]);
        Console.WriteLine(nums.Count);
    }
}

الإضافة والإدراج

تضيف Add العنصر في النهاية بتكلفة O(1) مُهتَسَبة. وتضيف AddRange عدة عناصر دفعةً واحدة.

تضع Insert(index, item) عنصرًا في موضع محدد، وتحرك كل ما يليه. ويجعل هذا التحريك عملية Insert في البداية بتكلفة O(n)، لذا يُفضّل الإضافة في النهاية متى أمكن.

var list = new List<string> { "b", "c" };
list.Insert(0, "a");
list.AddRange(new[] { "d", "e" });
// list is now a, b, c, d, e

إزالة العناصر

تحذف Remove(item) أول قيمة مطابقة، وتعيد true إذا عثرت عليها. أما RemoveAt(index) فتحذف حسب الموضع.

تحرك كلتا الدالتين العناصر اللاحقة إلى اليسار، لذلك تبلغ تكلفة الإزالة من المنتصف O(n). وتقبل RemoveAll شرطًا وتزيل كل العناصر المطابقة في مرور واحد.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 1, 2, 3, 4, 5 };
        nums.RemoveAll(n => n % 2 == 0);
        Console.WriteLine(string.Join(",", nums));
    }
}

البحث في قائمة

تخبرك Contains بما إذا كانت قيمة ما موجودة، بينما تعيد IndexOf موضعها أو القيمة -1. وتمسح كلتاهما العناصر خطيًا بتكلفة O(n).

إذا وجدت نفسك تبحث مرارًا عن قيمة في قائمة كبيرة، فستتراكم هذه التكلفة الخطية. وقد تكون HashSet أو Dictionary أنسب لهذه الحالة.

var names = new List<string> { "Ann", "Bob", "Cy" };
bool hasBob = names.Contains("Bob");   // true
int pos = names.IndexOf("Cy");          // 2

التكرار

تُعد حلقة foreach أوضح طريقة لقراءة كل عنصر. ويمكنك أيضًا استخدام حلقة for التقليدية عندما تحتاج إلى الفهرس.

لا تضف عناصر أو تزلها داخل حلقة foreach التي تمر على القائمة نفسها، لأن ذلك يؤدي إلى طرح InvalidOperationException.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var colors = new List<string> { "red", "green", "blue" };
        foreach (var c in colors)
            Console.WriteLine(c);
    }
}

الفرز

ترتب Sort() القائمة في مكانها باستخدام أداة المقارنة الافتراضية. ولتحديد ترتيب مخصص، مرّر مفوض مقارنة.

تبلغ تكلفة الفرز O(n log n). وللحصول على نسخة مرتبة من دون تغيير الأصلية، استخدم OrderBy من LINQ، إذ يعيد تسلسلاً جديدًا.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var nums = new List<int> { 4, 1, 3, 2 };
        nums.Sort();
        Console.WriteLine(string.Join(",", nums));
    }
}

Capacity مقابل Count

تمثل Count عدد العناصر الموجودة، بينما تمثل Capacity عدد العناصر التي يمكن للقائمة استيعابها قبل إعادة تخصيص مصفوفتها الداخلية.

عندما يتجاوز حجم القائمة السعة، تُخصَّص مصفوفة أكبر وتُنقل إليها العناصر، وغالبًا ما يتضاعف الحجم تقريبًا. وإذا كنت تعرف الحجم النهائي، فمرّره إلى المُنشئ لتجنب عمليات النسخ المتكررة.

var list = new List<int>(1000); // reserve capacity
for (int i = 0; i < 1000; i++)
    list.Add(i);
// no intermediate reallocations

تمرير List كوسيط إلى دالة

يُعد List<T> نوعًا مرجعيًا. وعند تمريره إلى دالة، يُمرَّر المرجع، لذلك تؤثر التغييرات داخل الدالة في قائمة المستدعي.

إذا كانت الدالة تقرأ فقط، فاستخدم IEnumerable<T> أو IReadOnlyList<T> كنوع للوسيط للإشارة إلى أنك لن تعدّل القائمة.

using System;
using System.Collections.Generic;

class Program {
    static void AddOne(List<int> xs) => xs.Add(1);
    static void Main() {
        var nums = new List<int>();
        AddOne(nums);
        Console.WriteLine(nums.Count); // 1
    }
}

التحويل والنسخ

ينتج ToArray() مصفوفة ثابتة الحجم، بينما ينشئ new List<T>(other) نسخة سطحية من تسلسل آخر.

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

var original = new List<int> { 1, 2, 3 };
int[] arr = original.ToArray();
var copy = new List<int>(original);

اختبار سريع

اختر العملية التي تبرز بتكلفتها.

مراجعة

تُعد List<T> مصفوفة قابلة للنمو وآمنة الأنواع. ويستغرق الوصول بالفهرس وقراءة Count وقتًا O(1)، كما تستغرق Add في النهاية وقتًا O(1) مُهتَسَبًا.

تستغرق عمليات الإدراج والإزالة والبحث عن قيمة في المنتصف O(n) بسبب التحريك أو المسح. احجز السعة مسبقًا عندما يكون الحجم معلومًا لتجنب إعادة التخصيص.

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

هل درس «استخدام List عمليًا» مجاني؟

نعم — نص درس «استخدام List عمليًا» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «استخدام List عمليًا»؟

أضف العناصر وأزلها وابحث عنها تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «استخدام List عمليًا»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. استخدام List عمليًا
  2. البحث في Dictionary
  3. HashSet والتفرّد
  4. اختيار مجموعة
← العودة إلى C# Academy