Delphi.Linq или sugar Spring4D

Delphi Linq

Искал какое-то время аналог C# Linq в Delphi. Встретил много чего интересного, но когда наткнулся на openSource библиотеку Spring4D, понял, что это то, что нужно.  В чем профит ?

Дело в том, что в System.Generics.Collections нет,  как ни странно, TCollection, которая позволяла бы делать вот такие финты, аналогичные цепочкам в C# Linq

Объявление

Как видно, здесь объявляется интерфейс, который богат на разнообразные Linq методы и расширяет стандартный функционал System.Generics.Collections

Заполнение

Использование

Результат

Вау! И это работает. На мой взгляд довольно удобная вещь. 

В тестовом примере, рядом с библиотекой

я встретил следующие примеры методов

Where

Skip

SkipWhile

Take

TakeWhile

Concat

First

FirstOrDefault

LastOrDefault

Last

ElementAt

Min

Max

Reversed

Foreach

Также есть Any (источник примера)

Ещё есть такие методы

  • All
  • IsEmpty
  • AsReadonlyList – returns the interfaces for read-only access to the list;

и др.

Таким образом, используя этот более высокий уровень абстракции, можно делать код более компактным и читабельным. Для меня эта находка оказалась ценной.


Nullable types

Простые типы можно сделать Nullable, вот пример


Shared<T> type

Это такой слегка недоделанный ISmartPointer, о котором я писал ранее. Смысл в том, что можно создавать переменные и не думать об их уничтожении. Но недоделанность заключается в том, что к членам класса нужно обращаться через Value, но этот момент поправлен в ISmartpointer, вот пример

Здесь, память под ссылками L, R почистится в момент выхода из области видимости, либо после присвоения им nil, как я понимаю (поскольку все это реализовано через стандартный механизм Delphi ARC, о котором я тоже писал ранее)


SortedList vs List

Нашёл в сети интересный пример. Spring4D может держать лист отсортированным при каждом добавлении элемента, и тогда метод IndexOf будет использовать более эффективный бинарный алгоритм поиска. Вот benchmark тест от автора

И результаты автора

У меня цифры немного другие, но суть та же.


Multimap

Это такой “словарь” с не уникальными ключами. Иногда это может быть нужно. То есть не нужно в ручную городить свою конструкцию  <key, value> и помещать, например в TObjectList<TMyManualConstruction>  Работает это так (источник примера)

Также в библиотеке много других полезных структур, расширяющих стандартные возможности Delphi, например, IDictionary<K, V> и соответственно  AsReadonlyDictionary<K, V>. Ну и конечно стеки, очереди


Ссылки по теме

Где скачать Spring4D

Обзор Spring4D на блоге PascalToday

Обзор DependencyInjection от Алексея Тимохина

Использование анонимных методов в Delphi

Лямбда выражение (FireMonkey)

[Spring4D] Освобождение памяти объектов интерфейсного типа

This entry was posted in Delphi. Bookmark the permalink.