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
كخطوة تالية؟ 😃
تعليقات
إرسال تعليق