۱۳۸۹/۰۸/۰۵

Count يا Any


با وجود امكانات مهياي توسط LINQ ، يك سري از عادات متداول حين كار با گروهي از اشياء بايد كنار گذاشته شوند؛ براي مثال چگونگي بررسي اين مطلب كه آيا شيء IEnumerable ما حاوي عنصري هست يا خير.
روش متداول انجام اينكار استفاده از متد Count است. چون اين متد پيش از تدارك امكانات LINQ نيز وجود داشته، بنابراين اولين موردي كه جهت بررسي آن به ذهن خطور مي‌كند، استفاده از متد Count مي‌باشد؛ براي مثال:
void Method(IEnumerable<Status> statuses)
{
if (statuses != null && statuses.Count() > 0)
// do something...
}
اين روش بهينه نيست زيرا كار متد Count بررسي تك تك عناصر شيء IEnumerable و سپس بازگرداندن تعداد آن‌ها است. اين مورد خصوصا در حالت‌هاي كار با بانك اطلاعاتي و تنظيمات lazy-loading آن و يا تعداد بالاي عناصر يك ليست، بسيار هزينه‌بر خواهد شد.
ولي در اينجا هدف ما اين است كه آيا شيء IEnumerable داراي حداقل يك عنصر است يا خير؟ بنابراين بجاي استفاده از متد Count بهتر است از يكي از extension methods فراهم شده توسط LINQ به نام Any استفاده شود.
كار متد Any ، پس از بررسي اولين عنصر يك مجموعه، خاتمه خواهد يافت و بديهي است كه نسبت به متد Count بسيار سريعتر و كم هزينه‌تر خواهد بود. علاوه بر آن حين كار با بانك‌هاي اطلاعاتي براي مثال توسط LINQ to Entities ، در SQL نهايي توليدي به EXISTS ترجمه خواهد شد.
void Method(IEnumerable<Status> statuses)
{
if (statuses != null && statuses.Any())
// do something...
}
خلاصه‌ي بحث:
از اين پس حين استفاده از انواع و اقسام ليست‌ها، آرايه‌ها، IEnumerable ها و امثال آن‌ها، جهت بررسي خالي بودن يا نبودن آن‌ها تنها از متد Any فراهم شده توسط LINQ استفاده نمائيد.
if (myArray != null && myArray.Any())
// do something...