/// <summary>
        /// Sorts books by condition that is provided by comparer.
        /// </summary>
        /// <param name="comparer">Comparer that will be used for sorting.</param>
        public IEnumerable <Book> SortBy(IComparer <Book> comparer)
        {
            BookValidator.CheckOnNull(comparer);
            var booksToSort = books.ToList();

            booksToSort.Sort(comparer);
            return(booksToSort);
        }
        /// <summary>
        /// Removes book from books.
        /// </summary>
        /// <param name="book">Book to add.</param>
        /// <exception cref="ItemIsNotFoundException">When book to remove doesn't exist.</exception>
        /// <exception cref="ArgumentNullException">Thrown when book is null.</exception>
        public void Remove(Book book)
        {
            BookValidator.CheckOnNull(book);
            if (!this.books.Contains(book))
            {
                throw new BookIsNotFoundException($"{nameof(book)} isn't found in list.");
            }

            books.Remove(book);
        }
        /// <summary>
        /// Adds book to books.
        /// </summary>
        /// <param name="book">Book to add.</param>
        /// <exception cref="DuplicateItemException">Thrown when there is a try to add already existing book.</exception>
        /// <exception cref="ArgumentNullException">Thrown when book is null.</exception>
        public void Add(Book book)
        {
            BookValidator.CheckOnNull(book);
            if (this.books.Contains(book))
            {
                throw new DuplicateBookException($"{nameof(book)} is already in list.");
            }

            books.Add(book);
        }
 /// <summary>
 /// Compares this book instance with given.
 /// </summary>
 /// <param name="other">Other book.</param>
 /// <returns>Result of comparison.</returns>
 public int CompareTo(Book other)
 {
     BookValidator.CheckOnNull(other);
     return(other.isbn.CompareTo(this.isbn));
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="BookListService"/> class.
 /// </summary>
 /// <param name="storage">Storage for books.</param>
 public BookListService(IBookListStorage storage)
 {
     BookValidator.CheckOnNull(storage);
     this.bookListStorage = storage;
 }
 /// <summary>
 /// Finds books that satisfy some criteria.
 /// </summary>
 /// <param name="searchCriteria">Search criteria.</param>
 /// <returns>Found books.</returns>
 public IEnumerable <Book> FindByTag(ISearchCriteria <Book> searchCriteria)
 {
     BookValidator.CheckOnNull(searchCriteria);
     return(GetMatchedBooks(searchCriteria));
 }