LINQ - SelectMany Operator

🔄 LINQ SelectMany Operator في #C


في هذا الدرس هنتعلّم عن SelectMany Operator في LINQ باستخدام لغة C# مع أمثلة توضيحية.


🧠 ما هو SelectMany؟

SelectMany هو واحد من Projection Operators في LINQ، وبيستخدم لما يكون عندنا قوائم داخل قوائم (Nested Collections)، وعايزين نفردهم في تسلسل واحد (Flat List).

بمعنى: بدل ما نرجّع List من Lists، SelectMany بيخلّي كل العناصر في تسلسل واحد.



🧾 Syntax

✅ Method Syntax:

collection.SelectMany(x => x.SubCollection);


✅ Query Syntax:

from x in collection  
from y in x.SubCollection  
select y;


✅ مثال عملي

public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
    public List<string> Subjects { get; set; }
}

List<Student> studentList = new List<Student>()
{
    new Student(){ ID = 1, Name = "Mahmoud", Subjects = new List<string>() { "Math", "Physics" } },
    new Student(){ ID = 2, Name = "Ali", Subjects = new List<string>() { "Biology", "Chemistry" } },
    new Student(){ ID = 3, Name = "Sara", Subjects = new List<string>() { "English", "History" } }
};


🔹 باستخدام Select (بيُرجّع Lists):

var result = studentList.Select(s => s.Subjects);

foreach (var subjectList in result)
{
    foreach (var subject in subjectList)
    {
        Console.WriteLine(subject);
    }
}

🔹 باستخدام SelectMany (بيفردهم):

var result = studentList.SelectMany(s => s.Subjects);

foreach (var subject in result)
{
    Console.WriteLine(subject);
}

النتيجة:

Math  
Physics  
Biology  
Chemistry  
English  
History


🧩 مثال مع Anonymous Type

var result = studentList.SelectMany(
    s => s.Subjects,
    (student, subject) => new { StudentName = student.Name, Subject = subject });

foreach (var item in result)
{
    Console.WriteLine(item.StudentName + " - " + item.Subject);
}

النتيجة:

Mahmoud - Math  
Mahmoud - Physics  
Ali - Biology  
Ali - Chemistry  
Sara - English  
Sara - History


📊 الفرق بين Select و SelectMany

الخاصية Select SelectMany
الإخراج تسلسل من القوائم (List of Lists) تسلسل مسطّح من العناصر
الاستخدام لو عايز تتعامل مع كل قائمة فرعية لوحدها لو عايز تدمج كل العناصر في قائمة واحدة


📝 الخلاصة:

  • SelectMany بيفرد كل العناصر في جميع القوائم الفرعية في تسلسل واحد.
  • مفيد في العلاقات One-to-Many.
  • ممكن تستخدمه مع lambda expressions أو query syntax.

تحب أكمّل في شرح Select كخطوة تالية؟ 😃

تعليقات

المشاركات الشائعة من هذه المدونة

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

Entity Framework - مقدمة عن Entity Framework