تفاوت SingleOrDefault و FirstOrDefault در سی شارپ
احتمالاً تا حالا برات پیش اومده که توی LINQ بخوای یه مقدار خاص رو از لیست پیدا کنی. دو تا متد خیلی معروف که برای این کار زیاد استفاده میشن، FirstOrDefault و SingleOrDefault هستن. اما تفاوتشون چیه؟ کدومشون بهتره؟ و چرا انتخاب درست بین این دو تا متد مهمه؟ تو این مقاله، قراره خیلی راحت و بدون پیچیدگی، این دو متد رو مقایسه کنیم و ببینیم که توی چه شرایطی بهتره از کدوم استفاده کنیم.
تفاوت SingleOrDefault و FirstOrDefault به در سی شارپ
FirstOrDefault چیست؟
FirstOrDefault اولین عنصری رو که با شرط ما جور درمیاد، برمیگردونه. اگه هیچ عنصری پیدا نشه، مقدار پیشفرض اون نوع داده رو برمیگردونه (مثلاً 0 برای int و null برای string).
مثال ساده:
فرض کن یه لیست از عددها داری و میخوای اولین عدد زوج رو پیدا کنی:
List<int> numbers = new List<int> { 1, 3, 5, 8, 10 };
int firstEven = numbers.FirstOrDefault(n => n % 2 == 0);
Console.WriteLine(firstEven); // خروجی: 8
نکات مهم:
✅ فقط اولین مقدار مطابق رو برمیگردونه.
✅ اگه چیزی پیدا نشه، مقدار پیشفرض رو برمیگردونه.
✅ برای لیستهای بزرگ و دیتابیس عملکرد بهتری داره.
✅ در EF Core بهینهتره و اجرای سریعتری داره.
SingleOrDefault چیست؟
SingleOrDefault دقیقاً مثل FirstOrDefault کار میکنه، با این تفاوت که فقط زمانی جواب میده که یک مقدار یکتا پیدا بشه. اگه هیچ مقداری پیدا نشه، مقدار پیشفرض رو برمیگردونه، ولی اگه بیش از یک مقدار پیدا بشه، خطا میده.
مثال ساده:
List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
int singleNumber = numbers.SingleOrDefault(n => n == 3);
Console.WriteLine(singleNumber); // خروجی: 3
حالا اگه دو تا مقدار مطابق پیدا بشه:
List<int> numbers = new List<int> { 1, 2, 3, 3, 5 };
int singleNumber = numbers.SingleOrDefault(n => n > 2);
// Exception: System.InvalidOperationException
نکات مهم:
❌ اگه بیشتر از یک مقدار پیدا بشه، خطا میده.
✅ وقتی مطمئنی که فقط یه مقدار باید باشه، ازش استفاده کن.
❌ در EF Core ممکنه باعث افت عملکرد بشه.
مقایسه FirstOrDefault و SingleOrDefault
| ویژگی | FirstOrDefault | SingleOrDefault |
|---|---|---|
| مقدار بازگشتی | اولین مقدار مطابق یا مقدار پیشفرض | مقدار یکتا یا مقدار پیشفرض |
| خطا در صورت چند مقدار | خیر | بله (InvalidOperationException) |
| مناسب برای لیستهای بزرگ؟ | بله | خیر (ممکنه افت عملکرد داشته باشه) |
| کاربرد در دیتابیس | بله، سریعتر و بهینهتر | خیر، ممکنه بهینه نباشه |
| بهترین استفاده در چه شرایطی؟ | وقتی دنبال اولین مقدار هستی | وقتی دقیقاً یک مقدار خاص انتظار داری |
کدوم رو کی استفاده کنیم؟
✅ اگه قراره اولین مقدار مطابق رو برداری، از FirstOrDefault استفاده کن.
✅ اگه مطمئنی که فقط یک مقدار باید وجود داشته باشه، از SingleOrDefault استفاده کن.
✅ اگه عملکرد و سرعت مهمه، FirstOrDefault گزینه بهتریه، مخصوصاً توی EF Core.
✅ اگه یه مقدار خاص رو از جدول دیتابیس میخوای و مطمئنی که یکتاست، SingleOrDefault خوبه.
نتیجهگیری
انتخاب بین FirstOrDefault و SingleOrDefault بستگی به شرایطی داره که توشون استفاده میشن. اگه دنبال اولین مقدار ممکن هستی، FirstOrDefault انتخاب بهتریه چون سریعتره و کارایی بالاتری داره. اگه مطمئنی که فقط یک مقدار وجود داره، SingleOrDefault رو انتخاب کن چون جلوی ورود دادههای ناخواسته رو میگیره.
محمد صابر جومند
نظرات کاربران
هیچ کامنتی هنوز ارسال نشده است.
لطفا برای ثبت نظر وارد اکانت خود شوید