Single و SingleOrDefault في LINQ

LINQ Single() و SingleOrDefault()

في هذا الدرس، سنتعرّف على الفرق بين دالتي Single() وSingleOrDefault() في LINQ، ومتى نستخدم كل واحدة منهما.



الفرق الأساسي:

الدالة ترجع عنصرًا واحدًا؟ ترمي استثناء لو مفيش؟ ترمي استثناء لو فيه أكتر من واحد؟ ترجع القيمة الافتراضية لو مفيش؟
Single()
SingleOrDefault()


مثال على Single():


List<int> numbers = new List<int>() { 5 };

int result = numbers.Single(); // 5
Console.WriteLine(result);


مثال على SingleOrDefault():


List<int> numbers = new List<int>();

int result = numbers.SingleOrDefault(); // 0
Console.WriteLine(result);


استخدام مع شرط:


List<int> numbers = new List<int>() { 2, 4, 6, 8 };

int result = numbers.Single(n => n == 6); // ✅ 6

// هذا يرمي استثناء لأنه فيه أكثر من عنصر > 3
int error = numbers.Single(n => n > 3); 


مثال مع كائنات:


public class Student
{
    public int ID { get; set; }
    public string Name { get; set; }
}

List<Student> students = new List<Student>()
{
    new Student() { ID = 1, Name = "Ali" },
    new Student() { ID = 2, Name = "Sara" },
    new Student() { ID = 3, Name = "Ali" }
};

Student result = students.SingleOrDefault(s => s.ID == 2); // Sara

// هذا يرمي استثناء لأن فيه أكثر من طالب اسمه "Ali"
Student error = students.Single(s => s.Name == "Ali");


ملاحظات مهمة:

  • استخدم Single() لما تتأكد إن فيه عنصر واحد فقط ينطبق عليه الشرط.
  • استخدم SingleOrDefault() لما تتوقع إن العنصر ممكن ما يكونش موجود.
  • لو فيه احتمال يرجع أكثر من عنصر → استخدم FirstOrDefault() أو Where().


تعليقات

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

C# - Arrays

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

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