متدهای LINQ First و FirstOrDefault در سی شارپ

در سی شارپ، First() و FirstOrDefault() دو روش متداول پسوند LINQ هستند که به شما امکان می دهند مجموعه ها، مانند آرایه ها، لیست ها و سایر انواع IEnumerable را پرس و جو کنید تا اولین عنصری را که با یک شرط مشخص مطابقت دارد، بازیابی کنید. در حالی که این روش ها ممکن است در نگاه اول مشابه به نظر برسند، اما از نظر رفتار متفاوت هستند، به خصوص زمانی که مجموعه خالی است یا زمانی که هیچ عنصری با شرایط مطابقت ندارد.
First() چیست؟
اول () یک متد LINQ است که اولین عنصر را در مجموعه ای که شرایط داده شده را برآورده می کند، برمی گرداند. اگر مجموعه خالی باشد یا هیچ عنصری با شرط مطابقت نداشته باشد، First() یک استثنا از نوع ایجاد می کند InvalidOperationException.
() FirstOrDefault چیست؟
FirstOrDefault() بسیار شبیه به First() است، اما با یک تفاوت کلیدی: زمانی که هیچ عنصری با شرط مطابقت نداشته باشد یا مجموعه خالی باشد، مقدار پیش فرض را برمی گرداند. مقدار پیش فرض بستگی به نوع عنصر مجموعه دارد. برای انواع مرجع (مانند کلاسها)، مقدار پیشفرض null است، و برای انواع مقادیر (مانند اعداد صحیح)، مقدار پیشفرض آن نوع است (مثلاً 0 برای int).
چه زمانی از First() و FirstOrDefault() استفاده کنیم؟
- هنگامی که مطمئن هستید که مجموعه خالی نخواهد بود و حداقل یک عنصر شرط را برآورده می کند، از First() استفاده کنید. این روش زمانی مفید است که عدم وجود عناصر منطبق با شرایط به عنوان یک خطا در برنامه شما در نظر گرفته شود.
مثال: اگر یک پایگاه داده را پرس و جو می کنید و دقیقا انتظار یک نتیجه را دارید، می توانید از First() برای واکشی آن رکورد استفاده کنید.
- زمانی که عدم وجود عنصر منطبق معتبر است و میخواهید از استثناها اجتناب کنید، از FirstOrDefault() استفاده کنید. این اغلب در سناریوهایی استفاده میشود که ممکن است مجموعه خالی باشد یا هیچ عنصری با شرایط مطابقت نداشته باشد، و شما میخواهید این موارد را به خوبی مدیریت کنید.
مثال: هنگام واکشی یک کاربر با شناسه یا نام کاربری، ممکن است از FirstOrDefault() استفاده کنید زیرا ممکن است کاربر وجود نداشته باشد و شما بتوانید نتیجه تهی را در کد خود مدیریت کنید.
سناریو: جستجوی کارمند با شناسه
تصور کنید ما لیستی از کارمندان داریم و می خواهیم یک کارمند را با شناسه آنها جستجو کنیم. لیست کارمندان ممکن است خالی باشد، یا ممکن است هیچ کارمندی با شناسه داده شده وجود نداشته باشد. ما چگونگی رفتار First() و FirstOrDefault() را در چنین موردی بررسی خواهیم کرد.
طبقه کارمند:public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
لیست کارکنان:List
{
new Employee { Id = 1, Name = "John Doe" },
new Employee { Id = 2, Name = "Jane Smith" },
new Employee { Id = 3, Name = "Mike Johnson" }
};
مثال 1: استفاده از First()
فرض کنید میخواهیم کارمندی با ID 4 پیدا کنیم. از آنجایی که هیچ کارمندی با آن ID در لیست وجود ندارد، استفاده از First() یک استثنا ایجاد میکند.try
{
var employee = employees.First(e => e.Id == 4);
Console.WriteLine($"Employee Found: {employee.Name}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Error: {ex.Message}"); // Output: "Sequence contains no elements"
}
در این مورد، از آنجایی که هیچ کارمندی شناسه 4 ندارد، First() یک InvalidOperationException می اندازد، که نشان می دهد هیچ عنصری با شرط مطابقت ندارد.
مثال 2: استفاده از FirstOrDefault()
اکنون بیایید ببینیم که در هنگام تلاش برای یافتن کارمندی با ID 4، FirstOrDefault() چگونه رفتار می کند.
var employee = employees.FirstOrDefault(e => e.Id == 4);
if (employee != null)
{
Console.WriteLine($"Employee Found: {employee.Name}");
}
else
{
Console.WriteLine("No employee found with ID 4"); // Output: "No employee found with ID 4"
}
در این مثال، FirstOrDefault() null را برمیگرداند زیرا هیچ کارمندی با ID 4 در لیست وجود ندارد. به جای ایجاد یک استثنا، میتوانیم با بررسی اینکه آیا کارمند تهی است یا خیر و پیامی به کاربر نمایش میدهیم، این پرونده را به خوبی مدیریت کنیم.
مثال 3: سناریوی لیست خالی
بیایید وضعیتی را در نظر بگیریم که در آن لیست کارکنان خالی است:
List emptyList = new List();
try
{
var employee = emptyList.First(e => e.Id == 1); // This will throw an exception
Console.WriteLine($"Employee Found: {employee.Name}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"Error: {ex.Message}"); // Output: "Sequence contains no elements"
}
حالا بیایید از FirstOrDefault() با همان لیست خالی استفاده کنیم:
var employee = emptyList.FirstOrDefault(e => e.Id == 1);
if (employee != null)
{
Console.WriteLine($"Employee Found: {employee.Name}");
}
else
{
Console.WriteLine("No employee found"); // Output: "No employee found"
}
خوراکی های کلیدی
-
اول () اگر مجموعه خالی باشد یا اگر هیچ عنصری شرایط را برآورده نکند، یک استثنا ایجاد می کند. این زمانی مفید است که می خواهید اطمینان حاصل کنید که عنصر باید وجود داشته باشد.
-
FirstOrDefault() اگر هیچ عنصری مطابقت نداشته باشد یا اگر مجموعه خالی باشد، مقدار پیشفرض (تهی برای انواع مرجع) را برمیگرداند. این اجازه می دهد تا زمانی که عدم وجود عنصر منطبق مورد انتظار یا معتبر باشد، کار ایمن تر انجام شود.
با استفاده از FirstOrDefault() در سناریوهایی که عدم وجود یک عنصر قابل قبول است، می توانید از خرابی های احتمالی در برنامه خود به دلیل استثناهای کنترل نشده جلوگیری کنید.
با درک این تفاوتها، میتوانید کدهای قابل پیشبینیتر و مقاومتر در برابر خطا بنویسید، مخصوصاً هنگام کار با منابع داده پویا یا نامشخص.
کد نویسی مبارک!