C# Programming

تحويل IEnumerable إلى List بكفاءة في C#

Spread the love

تحويل IEnumerable إلى List بكفاءة في C#

تتناول هذه المقالة طرقًا مختلفة لتحويل IEnumerable<T> إلى List<T> في C#، مع مقارنة كفاءتها وملاءمتها لمختلف السيناريوهات. إن فهم الفروق الدقيقة لهذه الهياكل البياناتية أمر بالغ الأهمية لكتابة شفرة مُحسّنة وقابلة للصيانة.

محتويات الجدول

فهم IEnumerable<T> و List<T>

يعمل كل من IEnumerable<T> و List<T> مع المجموعات، لكن خصائصهما تختلف اختلافًا كبيرًا:

  • IEnumerable<T>: تمثل هذه الواجهة تسلسلًا من العناصر التي يمكن تكرارها باستخدام حلقة foreach. وهي للقراءة فقط؛ لا يمكنك إضافة أو إزالة أو تعديل العناصر مباشرةً. وهي مثالية للسيناريوهات التي تحتاج فيها إلى معالجة العناصر بشكل تسلسلي دون الحاجة إلى الوصول العشوائي أو التعديل.
  • List<T>: فئة ملموسة تمثل مصفوفة ذات حجم ديناميكي. توفر طرقًا لإضافة وإزالة وإدراج العناصر والوصول إليها حسب الفهرس. توفر مرونة للتلاعب ولكنها تستهلك المزيد من الذاكرة لأنها تخزن المجموعة بأكملها في الذاكرة.

متى يتم تحويل IEnumerable<T> إلى List<T>

يصبح التحويل ضروريًا عندما:

  • الوصول العشوائي: يسمح List<T> بالوصول المباشر (مثل: myList[5])، على عكس IEnumerable<T>.
  • تعديل المجموعة: يدعم List<T> إضافة وإزالة وإدراج العناصر.
  • التكرارات المتعددة: قد يكون التحويل إلى List<T> أكثر كفاءة للتكرارات المتعددة، مما يتجنب تعداد المصدر المتكرر.
  • متطلبات الطريقة: تتوقع بعض الطرق أو المكتبات List<T> كمدخل.

استخدام طريقة ToList()

النهج الأكثر كفاءة وتوصية هو استخدام طريقة الامتداد ToList() من LINQ:


IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = numbers.ToList();

استخدام مُنشئ List<T>

يقبل مُنشئ List<T> أيضًا IEnumerable<T>:


IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>(numbers);

هذا مكافئ وظيفيًا لـ ToList().

استخدام بناء جملة استعلام LINQ

على الرغم من إمكانية ذلك، إلا أن بناء جملة استعلام LINQ أقل إيجازًا وكفاءة:


IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = (from number in numbers select number).ToList();

استخدام حلقة foreach

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


IEnumerable<int> numbers = Enumerable.Range(1, 10);
List<int> numberList = new List<int>();
foreach (int number in numbers)
{
    numberList.Add(number);
}

إنشاء طرق امتداد مخصصة

للحصول على تحويلات متخصصة، قم بإنشاء طرق امتداد مخصصة. على سبيل المثال:


public static class MyExtensions
{
    public static List<T> ToListAndSort<T>(this IEnumerable<T> source) where T : IComparable<T>
    {
        List<T> list = source.ToList();
        list.Sort();
        return list;
    }
}

الخلاصة

تُعد طريقة ToList() الخيار الأمثل لتحويل IEnumerable<T> إلى List<T> في C#. الطرق الأخرى أقل كفاءة أو أقل قابلية للقراءة ما لم يكن لديك سبب محدد لاستخدامها. ضع دائمًا في اعتبارك آثار الذاكرة عند التعامل مع مجموعات بيانات كبيرة.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *