تجميع القوائم في الذاكرة في 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#، فلا تتردد في ترك تعليق أدناه!