ما هي دالة ToLookup في LINQ؟

دالة ToLookup في LINQ

دالة ToLookup في LINQ بتسمح لك تبني هيكل شبيه بـ Dictionary لكن كل مفتاح مربوط بمجموعة من العناصر بدل عنصر واحد.



الصيغة العامة:


var lookup = collection.ToLookup(item => item.Key);


الفرق بينها وبين GroupBy:

  • GroupBy بتنفيذ مؤجل (Lazy / Deferred Execution)
  • ToLookup بتنفيذ فوري (Immediate Execution)


تعريف الكائن:


public class Student
{
    public int StudentID { get; set; }
    public string Name { get; set; }
    public string Branch { get; set; }
    public string Gender { get; set; }
}


البيانات:


List<Student> studentList = new List<Student>()
{
    new Student() { StudentID = 1, Name = "John", Branch = "CSE", Gender = "Male"},
    new Student() { StudentID = 2, Name = "Moin", Branch = "CSE", Gender = "Male"},
    new Student() { StudentID = 3, Name = "Sara", Branch = "CSE", Gender = "Female"},
    new Student() { StudentID = 4, Name = "Ram", Branch = "ECE", Gender = "Male"},
    new Student() { StudentID = 5, Name = "Sania", Branch = "ECE", Gender = "Female"},
    new Student() { StudentID = 6, Name = "Ravi", Branch = "EEE", Gender = "Male"},
    new Student() { StudentID = 7, Name = "Anjali", Branch = "EEE", Gender = "Female"}
};


استخدام ToLookup حسب Branch:


var studentLookup = studentList.ToLookup(s => s.Branch);

foreach (var group in studentLookup)
{
    Console.WriteLine($"Branch: {group.Key}, Count: {group.Count()}");
    foreach (var student in group)
    {
        Console.WriteLine($"  {student.Name} ({student.Gender})");
    }
}


النتيجة:


Branch: CSE, Count: 3
  John (Male)
  Moin (Male)
  Sara (Female)
Branch: ECE, Count: 2
  Ram (Male)
  Sania (Female)
Branch: EEE, Count: 2
  Ravi (Male)
  Anjali (Female)


استخدام ToLookup بمفتاح مركب (Branch + Gender):


var studentLookup = studentList.ToLookup(s => new { s.Branch, s.Gender });

foreach (var group in studentLookup)
{
    Console.WriteLine($"Branch: {group.Key.Branch}, Gender: {group.Key.Gender}, Count: {group.Count()}");
    foreach (var student in group)
    {
        Console.WriteLine($"  {student.Name}");
    }
}


النتيجة:


Branch: CSE, Gender: Male, Count: 2
  John
  Moin
Branch: CSE, Gender: Female, Count: 1
  Sara
Branch: ECE, Gender: Male, Count: 1
  Ram
Branch: ECE, Gender: Female, Count: 1
  Sania
Branch: EEE, Gender: Male, Count: 1
  Ravi
Branch: EEE, Gender: Female, Count: 1
  Anjali


نصائح:

  • استخدم ToLookup لما تحتاج تجمع وتبحث بسرعة حسب مفتاح.
  • لو محتاج الأداء، ToLookup أفضل من GroupBy في بعض السيناريوهات لأنه بيكون جاهز بمجرد إنشاؤه.
  • يمكنك الوصول للمجموعة مباشرة: studentLookup["CSE"]


تعليقات

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

C# - Arrays

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

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