أسرع طريقة للعثور على العناصر المشتركة عبر عدة قوائم في C#

عند العمل مع المجموعات في C#، قد تواجه مواقف تحتاج فيها إلى العثور على عناصر مشتركة عبر عدة قوائم. يعد هذا مفيدًا بشكل خاص عندما تريد تصفية النتائج بناءً على معايير محددة. في منشور المدونة هذا، سنتناول سيناريو شائعًا: كيفية تحديد مجموعة فرعية من كائنات Option التي تظهر في كل قائمة ضمن مجموعة قوائم.

مشكلة البيان

تخيل أنك تمتلك مجموعة من القوائم، وتحديدًا هيكل مثل List<List<Option>> optionLists. تحتاج إلى تحديد أي من كائنات Option موجودة في جميع القوائم N. لحل هذه المشكلة، يجب أن نكون على علم بأن المساواة بين كائنات Option تحددها خاصية سلسلة محددة، مثل option1.Value == option2.Value. في النهاية، نريد إرجاع List<Option> حيث يظهر كل عنصر مرة واحدة فقط.

الحل: العثور على الخيارات المشتركة

لمعالجة هذه المشكلة، يمكننا استخدام LINQ (استعلام متكامل من اللغة) في C#. يوفر LINQ طريقة قوية لاستعلام المجموعات، مما يجعله مثاليًا لحالتنا. أدناه يوجد مقتطف كود فعال ينفذ هذه المهمة:

var x = from list in optionLists
        from option in list
        where optionLists.All(l => l.Any(o => o.Value == option.Value))
        orderby option.Value
        select option;

شرح الكود

لنحلل استعلام LINQ خطوة بخطوة:

  1. عبارة From الخارجية: تؤدي الجزء الأول from list in optionLists إلى تكرار كل قائمة في قائمة القوائم الرئيسية لدينا (optionLists).

  2. عبارة From الداخلية: تؤدي الجزء الثاني from option in list إلى الوصول إلى كل Option داخل القائمة الحالية.

  3. عبارة Where: هذه هي الجزء الحاسم من الحل:

    • الشرط where optionLists.All(l => l.Any(o => o.Value == option.Value)) يتحقق مما إذا كان الخيار الحالي موجودًا في جميع القوائم داخل optionLists.
    • تتحقق طريقة Any مما إذا كان هناك أي Option o في القائمة الحالية l حيث تتطابق Value مع Value للخيار الحالي.
  4. ترتيب النتائج: تقوم عبارة orderby option.Value بترتيب كائنات Option الناتجة بناءً على Value الخاص بها.

  5. عبارة Select: أخيرًا، يقوم select option بجمع جميع الخيارات المؤهلة في مجموعة.

اعتبارات مهمة

  • قيم مميزة: لا يتضمن الكود المقدم تحديدًا مميزًا، مما يعني أنه يمكن أن يرجع عدة كائنات Option بنفس Value. إذا كنت بحاجة إلى خيارات فريدة، فقد ترغب في إضافة .Distinct() إلى استعلامك.

  • الأداء: اعتمادًا على حجم قوائمك، فإن كفاءة هذا النهج لها أهمية كبيرة. استعلامات LINQ محسن ويمكن أن تؤدي بشكل جيد مع مجموعات البيانات ذات الحجم المعقول.

الخاتمة

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

الآن بعد أن تم تزويدك بهذه المعرفة، يمكنك تنفيذ مثل هذه الحلول بسهولة في مشاريعك، مما يجعل التعامل مع المجموعات أبسط وأكثر كفاءة.