/// <summary>
 /// Конструктор.
 /// </summary>
 /// <param name="source">Источник.</param>
 /// <param name="query">Запрос.</param>
 /// <param name="sortPosts">Сортировать посты.</param>
 public FilteredPostCollection(IPostCollectionViewModel source, IPostCollectionSearchQuery query, bool sortPosts = true)
 {
     if (source == null) throw new ArgumentNullException(nameof(source));
     if (query == null) throw new ArgumentNullException(nameof(query));
     Source = source;
     Query = query;
     MergeAndSortPosts = sortPosts;
     Source.PostsUpdated += SourceOnPostsUpdated;
     SetPosts();
 }
 /// <summary>
 /// Получить отфильтрованный список постов.
 /// </summary>
 /// <param name="src">Список постов.</param>
 /// <param name="query">Запрос.</param>
 /// <param name="sortPosts">Сортировать посты.</param>
 /// <returns>Результат.</returns>
 public static IFilteredPostCollection FilterPosts(this IPostCollectionViewModel src, IPostCollectionSearchQuery query, bool sortPosts = true)
 {
     return new FilteredPostCollection(src, query, sortPosts);
 }
 /// <summary>
 /// Найти пост.
 /// </summary>
 /// <param name="src">Спиок постов.</param>
 /// <param name="query">Запрос.</param>
 /// <returns>Результат.</returns>
 public static IPostViewModel FindPost(this IPostCollectionViewModel src, IPostCollectionSearchQuery query)
 {
     return src.Posts.FirstOrDefault(query.Filter);
 }