using System.Collections.Generic;
var totalPages = (int)Math.Ceiling((decimal)totalItems / (decimal)pageSize);
else if (currentPage > totalPages)
currentPage = totalPages;
if (totalPages <= maxPages)
var maxPagesBeforeCurrentPage = (int)Math.Floor((decimal)maxPages / (decimal)2);
var maxPagesAfterCurrentPage = (int)Math.Ceiling((decimal)maxPages / (decimal)2) - 1;
if (currentPage <= maxPagesBeforeCurrentPage)
else if (currentPage + maxPagesAfterCurrentPage >= totalPages)
startPage = totalPages - maxPages + 1;
startPage = currentPage - maxPagesBeforeCurrentPage;
endPage = currentPage + maxPagesAfterCurrentPage;
var startIndex = (currentPage - 1) * pageSize;
var endIndex = Math.Min(startIndex + pageSize - 1, totalItems - 1);
var pages = Enumerable.Range(startPage, (endPage + 1) - startPage);
CurrentPage = currentPage;
public int TotalItems { get; private set; }
public int CurrentPage { get; private set; }
public int PageSize { get; private set; }
public int TotalPages { get; private set; }
public int StartPage { get; private set; }
public int EndPage { get; private set; }
public int StartIndex { get; private set; }
public int EndIndex { get; private set; }
public IEnumerable<int> Pages { get; private set; }
public static void main(string [] args) {