Колекции в
Почти всеки ден използваме определени колекции. Най-често без дори да се замисляме кои и защо ги използваме. В тази статия ще разгледаме основните механизми за работа с колекции в .NET. Като начало, нека да разгледаме йерархията на някои интерфейси в .NET.
Повечето колекции имплементират интерфейса IEnumerable изрично или имплицитно. Тъй като Array не е общ тип, той наследява само IEnumerable, а не IEnumerable.
IEnumerable
Интерфейсът IEnumerable указва, че типът имплементира GetEnumerator. Конструкцията foreach става достъпна. Разширенията от System.Linq често се използват с IEnumerable. Генеричният интерфейс се използва при връщане от заявки (например към база данни или други колекции). Заявка, която избира цели числа, ще бъде от тип IEnumerable.
IEnumerable е подходящ за итерация върху колекция. Не можете да променяте (добавяте или премахвате) данни от IEnumerable. В случай на заявка към база данни на сървъра, заявката ще върне всички данни (без филтриране).
IEnumerable
IQueryable
Винаги, когато сме изправени пред голямо количество данни, трябва да помислим коя колекция или кой тип да използваме, за да работим с тях. За разлика от IEnumerable - IQueryable предлага висока производителност при работа с голямо количество данни. IQueryable предварително филтрира данните в заявката и след това изпраща само филтрираните данни на клиента.
Разлика между IQueryable и IEnumerable
Основната разлика между тези интерфейси е, че IEnumerable работи с целия масив от данни, докато IQueryable работи с филтрирания. IEnumerable получава всички данни от страна на сървъра и ги зарежда в паметта и след това ви позволява да филтрирате данните отпамет. Когато се направи заявка към база данни, IQueryable изпълнява заявката от страната на сървъра и прилага филтриране върху заявката.
Кога да приложите какво
IEnumerable
- IEnumerable може да се движи само напред в колекция, не може да се движи назад
- Добър за работа с данни в паметта (списъци, масиви)
- Подходящ за LINQ to Object и LINQ to XML
- Поддържа отложено изпълнение
- Не поддържа персонализирани заявки
- Не поддържа отложено зареждане
- Методи за разширение, които работят върху IEnumerable, приемат функционални обекти
IQueryable
- IQueryable може да се движи само напред през колекция, не може да се движи назад.
- IQueryable работи по-добре със заявки към база данни (без памет)
- Подходящ за LINQ към SQL
- Поддържа отложено изпълнение
- Поддържа произволни заявки (с помощта на CreateQuery и метода Execute)
- Поддържа мързеливо зареждане
- Методите за разширение, които работят с IQueryable, приемат изразни обекти (изразно дърво)
ICollection
По подобен начин с IEnumerable има 2 версии на този интерфейс. ICollection и ICollection.
ICollection наследява от IEnumerable. Това означава, че допълнително трябва да внедрите интерфейса IEnumerable. Интерфейсът дефинира размера, изброяванията и методите за синхронизиране за всички негенерични колекции.
ICollection
За разлика от IEnumerable и IEnumerable - ICollection е различен от неговия негенеричен еквивалент.
Както всичко, което разгледахме досега, IList се предлага в обикновена и обща версия. Помислете за негенерична версия на интерфейса IList.
В допълнение към интерфейсите ICollection и IEnumerable, IListпредоставя методи за добавяне и премахване на елементи от колекция. Също така ви позволява да откриете индекса на елемент в колекцията. Също така IList прилага индексатор за достъп до обекти чрез квадратни скоби. Например така:
Генеричната версия е различна от аналога. а именно:
Спомняйки си за ICollection, където са декларирани методите за работа с колекцията IList, той добавя само липсващите методи: търсене на елементи и индексатор.
Заключение
Сега, след като разгледахме всички интерфейси, можем да решим кой да се използва в конкретна ситуация. Както е правилно, добра идея е да разчитате само на нещата, от които наистина се нуждаете.
Като използваме IEnumerable вместо IList, ние защитаваме срещу непланирани промени в колекцията. Като използвате IEnumerable, вашият метод може да използва всеки тип, който имплементира IEnumerable (от фигурата в началото на статията това е всяка колекция). Програмният код може лесно да се промени в бъдеще, без да нарушава нищо, като замени IEnumerable с по-силен интерфейс.
- IEnumerable - единственото нещо, от което се нуждаете, е да преминете през всички елементи на колекцията. Достъп само за четене до колекция
- ICollection - възможността да промените колекцията и да разберете нейния размер
- IList - възможност за промяна на колекцията. Освен това редът (индексът на елементите) става достъпен
- Списък - в съответствие с един от принципите на SOLID (инверсия на зависимостта) - винаги трябва да разчитате на абстракциите, а не на техните реализации.
Извън обхвата на тази статия бяха други интересни .NET колекции, като опашка (Queue), стек (Stack), хеш таблица (HashTable) и речник (Dictionary).