تجميع القوائم في الذاكرة في C# باستخدام LINQ والتعبيرات اللامدا

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

فهم المشكلة

تخيل أن لديك قائمة من كائنات Foo، حيث يحتوي كل كائن Foo على خصائص Bar و Lum. قد تتشارك بعض حالات Foo نفس القيمة لـ Bar. هدفك هو تجميع هذه الحالات من Foo حسب قيم Bar الخاصة بها ثم التكرار عبر المجموعات المجتمعة للوصول إلى قيم Lum المقابلة لها. يمكن أن يعزز هذا تنظيم البيانات ويجعل من الأسهل التلاعب بمجموعات معينة من البيانات.

سيناريو المثال

دعونا نعتبر مثالاً معيناً مع القائمة التالية من حالات Foo:

var foos = new List<Foo> {
   new Foo{Bar = 1,Lum = 1},
   new Foo{Bar = 1,Lum = 2},
   new Foo{Bar = 2,Lum = 3},
};

الناتج المطلوب

نريد تجميع هذه الحالات من Foo وفقًا لقيم Bar الخاصة بها، في النهاية ننتج شيئًا مثل:

  • لـ Bar = 1: Lum = 1، Lum = 2
  • لـ Bar = 2: Lum = 3

الحل باستخدام LINQ

يمكنك تجميع كائنات Foo باستخدام جملة group by في LINQ. إليك كيف يمكن تحقيق ذلك:

var groupedFoos = from foo in foos
                  group foo by foo.Bar into grouped
                  let lums = from g in grouped
                             select g.Lum
                  select new { Bar = grouped.Key, Lums = lums };

خطوات مشروحة

  • تجميع بواسطة: الجزء group foo by foo.Bar يقوم بتجميع حالات Foo بناءً على خاصية Bar.
  • إلى مجمّع: هذا ينشئ نطاقًا جديدًا لكل مجموعة.
  • اختيار قيم Lum: العبارة let lums تتيح لك إنشاء مجموعة جديدة تتكون من قيم Lum من الكائنات المجتمعة.
  • الاختيار النهائي: الاختيار النهائي يجمع كل شيء في كائن جديد يحتوي على قيمة Bar وقائمة القيم Lum المقابلة لها.

الحل باستخدام التعبيرات اللامدا

بدلاً من ذلك، يمكنك تحقيق نفس النتيجة باستخدام التعبيرات اللامدا، مما يمكن أن يوفر تركيبة أكثر اختصارًا. إليك كيف:

var groupedFoos = foos.GroupBy(x => x.Bar)
                      .Select(y => new { Bar = y.Key, Lums = y.Select(z => z.Lum) });

كيفية عملها

  • GroupBy: تأخذ هذه الطريقة دالة لامدا لتحديد الخاصية التي نريد التجميع بناءً عليها، وهي x.Bar.
  • Select: بعد التجميع، نستخدم Select لإنشاء كائن مجهول جديد لكل مجموعة، يحتوي على قيمة Bar وقيم Lum المقابلة.

التكرار عبر البيانات المجتمعة

بغض النظر عما إذا كنت تستخدم LINQ أو التعبيرات اللامدا، يبقى التكرار عبر البيانات المجتمعة كما هو. يمكنك التكرار عبر كل مجموعة وطباعة قيم Lum كما يلي:

foreach (var group in groupedFoos)
{
    Console.WriteLine("Lums for Bar#" + group.Bar);
    foreach (var lum in group.Lums)
    {
        Console.WriteLine(lum);
    }
}

سيكون الناتج كما يلي:

Lums for Bar#1
1
2
Lums for Bar#2
3

الخاتمة

تجميع القوائم في الذاكرة باستخدام LINQ أو التعبيرات اللامدا في C# هو وسيلة قوية لتنظيم بياناتك. سواء كنت تفضل قراءة تركيبة LINQ أو اختصار التعبيرات اللامدا، ستمكنك كِلا الطريقتين من تحقيق التجميع المطلوب لبياناتك بفعالية.

بالنسبة لأولئك الراغبين في تعميق فهمهم لـ LINQ، يُنظر في استكشاف 101 مثال على LINQ لمزيد من الأمثلة الشاملة.

إذا كانت لديك أي أسئلة أو ترغب في مشاركة تجاربك في تجميع البيانات في C#، فلا تتردد في ترك تعليق أدناه!