ienumerable vs Ireadonlylist in .net: چه زمانی باید از هر کدام استفاده کنید؟

اگر در C# و .NET کار می کنید ، به سرعت در رابط های مختلف مجموعه مانند اجرا خواهید شد IEnumerable
وت IReadOnlyList
بشر در نگاه اول ، آنها کاملاً مشابه به نظر می رسند-هر دو به شما اجازه می دهند با مجموعه ای از موارد به روشی خواندنی کار کنید. پس چه زمانی باید از هر کدام استفاده کنید؟ در این پست ، اختلافات را تجزیه می کنم ، موارد استفاده در دنیای واقعی را نشان می دهم و نمونه های کد را به شما می دهم تا دقیقاً بدانید که چه زمانی به یک یا دیگری دسترسی پیدا کنید.
تعاریف سریع
ساده ترین راه برای نشان دادن دنباله ای از مواردی که می توانید از آن استفاده کنید (با استفاده از foreach). این امکان را به شما نمی دهد که از طریق فهرست دسترسی پیدا کنید یا مستقیماً تعداد آنها را دریافت کنید.
یک لیست فقط خواندنی از موارد را نشان می دهد. شما می توانید به صورت فهرست به موارد دسترسی پیدا کنید و تعداد موارد را دریافت کنید ، اما نمی توانید مجموعه را تغییر دهید.
نمونه های کد
مثال 1: استفاده از IEnumerable
public IEnumerable<string> GetAllProductNames()
{
// Could return from a database query, LINQ, etc.
return products.Select(p => p.Name);
}
// Usage
foreach (var name in GetAllProductNames())
{
Console.WriteLine(name);
}
چه زمانی استفاده کنید:
- هنگامی که شما فقط نیاز به تکرار (حلقه) بر روی موارد دارید.
- هنگامی که نتایج ممکن است در پرواز جریان ، تولید یا فیلتر شود.
- لازم نیست تعداد دقیق موارد یا موقعیت های آنها را بدانید.
مثال 2: استفاده از IReadOnlyList
public IReadOnlyList<Product> GetFeaturedProducts()
{
// Return a fixed, materialized list
return featuredProducts.AsReadOnly();
}
// Usage
for (int i = 0; i < GetFeaturedProducts().Count; i++)
{
var product = GetFeaturedProducts()[i];
Console.WriteLine($"{i}: {product.Name}");
}
چه زمانی استفاده کنید:
- هنگامی که شما نیاز به دسترسی به موارد توسط فهرست آنها دارید (به عنوان مثال ، لیست[0]).
- هنگامی که می خواهید تعداد (لیست) را در معرض دید قرار دهید.
- هنگامی که می خواهید تضمین کنید که این مجموعه ثابت است و توسط مصرف کننده قابل تغییر نیست.
نشان | ienumerable | ineadonlylist |
---|---|---|
می تواند با foreach حلقه کند | ✅ | ✅ |
دسترسی توسط فهرست | ❌ | ✅ |
شمارش | ❌ | ✅ |
تغییر ناپذیر/فقط خواندنی | ❌ (فقط تکرار می شود) | ✅ (قرارداد فقط خواندنی) |
اعدام معوق | ✅ (اغلب) | ❌ (معمولاً مادی) |
چگونه تصمیم بگیریم از کدام استفاده شود
-
استفاده کردن
IEnumerable
هنگامی که می خواهید کارها را ساده نگه دارید ، فقط باید حلقه کنید ، یا می خواهید اجازه دهید نتایج را پخش کنید. -
استفاده کردن
IReadOnlyList
هنگامی که شما می خواهید ایمنی و راحتی یک لیست ثابت و فقط خواندنی باشد که هم دسترسی و هم دسترسی مبتنی بر شاخص را در معرض دید قرار می دهد.
نمونه های دنیای واقعی
الگوی مخزن (فقط خواندنی)
- استفاده کردن
IEnumerable
برای مجموعه داده های بزرگ می خواهید در صورت تقاضا جریان یا فیلتر کنید. - استفاده کردن
IReadOnlyList
برای روشهایی که مجموعه ای از نتایج را که می خواهید قفل کنید (مانند 10 محصول برتر) بازگردانید.
پاسخ API
-
استفاده کردن
IReadOnlyList
برای بازگشت یک مجموعه واضح و ثابت (به سریال سازی و قراردادها کمک می کند). -
استفاده کردن
IEnumerable
در داخل ، به ویژه هنگام زنجیر کردن نمایش داده های Linq.
نکته سریع برای نوجوانان
- اگر می خواهید به دیگران اجازه دهید از طریق داده های خود حلقه کنند ، از آنها استفاده کنید
IEnumerable
بشر - اگر می خواهید به دیگران اجازه دهید ببینند چند مورد را در اختیار شما قرار می دهند و از طریق فهرست دسترسی دارند – اما هر چیزی را اصلاح نمی کنند – استفاده
IReadOnlyList
بشر
سؤالاتی دارید یا می خواهید نکات دات نت در دنیای واقعی بیشتر؟ نظر زیر را رها کنید!