هر موردی ارزش پیگیری و پس از آن یادگیری را ندارد. یادگیری پراکنده و بدون کاربرد، بهزودی فراموش خواهد شد و اثر تلاش را بیارزش میکند.
یکی از موارد مهمی که شناختن تفکیک آنها ارزش و اهمیت ویژهای دارد - در سیشارپ و دنیای داتنت-، کالکشنهاست.
در یک تعریف معمولی آرایه، تعداد آیتمهای آن فیکس هستند و نمیتوان چیزی بدان اضافه کرد.
int[] fixedArray = { 1, 2, 3, 4 };
با استفاده از ArrayList میتوانیم لیستی با طول داینامیک تعریف کنیم و چون از نوع object نگهداری میکند میتوانیم هر چیزی را نگهداری کنیم که بهشدت پرمونس را تحتتاثیر قرار میدهد. برای همین جنریکها ایجاد شدند.
var dynamicArray = new System.Collections.ArrayList();
dynamicArray.Add("hello"); //adding a string
dynamicArray.Add(1); //adding an int
از IEnumerable و فرزند جنریک آن IEnumberable<T> بسیار بدلیل سرعت بالا استفاده میشود. ولی این فقط بلد است از آیتمهای لیست خودش به بعدی حرکت کند و در درون خودش گردش کند مثلا اندیس ندارد و حذف کردن و اضافه کردن و مثلا count ندارد. / البته میشود با Countی که از Linq داریم تعدادش را محاسبه کند.
کالکشن ICollection<T> فرزند IEnumerable<T> است که علاوه بر GetEnumerator که قادر به حرکت کردن از یک آیتم به آیتم دیگر را فراهم میسازد، میتواند تعداد/حذف/اضافه/شامل را هم داشته باشد. از ICollection معمولا استفاده نمیشود.
کالکشنی IList<T> که از ICollection<T> ارثبری میکند، و کلیه قابلیتهای گردش در کالکشن، حذف، شمارش، اضافه کردن را دارد. به اضافهی آنکه میتواند به هر کدام از مقادیر کالکشن اندیس اختصاص میدهد و از یک مقدار، اندیس آنرا بگوید (IndexOf). و بسیار استفاده میشود.
فرقی نمیکند که چه آبجکتی باشد (جنریک) هرچه باشد IList<T> به المان درونیاش اندیس جهت دسترسی تخصیص میدهد.
از IList<T> زمانی باید استفاده کرد که میخاهیم بدونیم هر المان در کجا قرار گرفته است.
در IQueryableها که از IEnumerableها ارثبری میکنند. خاصیتی وجود دارد بهنام کلاسی هست شامل کدهای سیشارپی که تازمانیکه نیاز به محتوای آن نداریم اجرا نمیشود) و با استفاده از ان میتوانیم کوئریهایی بنویسیم (دستورالعمل و نه اطلاعات) و بعدا اجرا کنیم (زمانیکه اجرا شد اطلاعات بدست میرسند)
جهت لیست کردن یک آرایه آنرا ToList میکنیم. و جهت Queryable کردن آن AsQueryable میکنیم آنرا.
خروجی DbSetهای EF، از جنس IQuerable هستند که اکسپرشن خروجی بدهد.
اگر میخاهیم که با یک دادهای کار کنیم بهتر است دیگر اکسپرشن نباشد و آنرا به لیست تبدیل کنیم و با دادههای آن کار کنیم. اما کوئریهای بزرگ بهتر است expression باشد که حالت دستورالعمل دارد و در موقع لازم اجرا میشود و در سرعتعمل موثر است