public class Pager : IPager { private int _pageIndex;
public class Pager<T> : IPager<T>
{
private int _pageIndex;
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageIndex => _pageIndex;
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
public IGrouping<int, T> CurrentPage => this[_pageIndex];
public void Next() => _pageIndex++;
public void Prev() => _pageIndex--;
}
public class Pager : IPager { private int _pageIndex;
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageIndex => _pageIndex;
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
public IGrouping<int, T> CurrentPage => this[_pageIndex];
public void Next() => _pageIndex++;
public void Prev() => _pageIndex--;
}
public class Pager<T> : IPager<T>
{
private int _pageIndex;
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageIndex => _pageIndex;
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
public IGrouping<int, T> CurrentPage => this[_pageIndex];
public void Next() => _pageIndex++;
public void Prev() => _pageIndex--;
}
public static IEnumerable<IGrouping<int, T>> GroupByPage<T>(this IEnumerable<T> values, int pageSize)
{
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
return values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v)
.ToList();
}
First we create an interface (you can also add page index and next/prev methods):
public interface IPager<out T>
{
int PageIndex { get; }
int PageSize { get; }
int PageCount { get; }
IGrouping<int, T> CurrentPage { get; }
IGrouping<int, T> this[int page] { get; }
void Next();
void Prev();
}
public class Pager : IPager { private int _pageIndex;
public class Pager<T> : IPager<T>
{
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageIndex => _pageIndex;
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
public IGrouping<int, T> CurrentPage => this[_pageIndex];
public void Next() => _pageIndex++;
public void Prev() => _pageIndex--;
}
public class ConsolePager<T> : IPager<T>
{
private readonly IPager<T> _pager;
public ConsolePager(IPager<T> pager)
{
_pager = pager;
}
public int PageIndex => _pager.PageIndex;
public int PageSize => _pager.PageSize;
public int PageCount => _pager.PageCount;
public IGrouping<int, T> this[int page]CurrentPage => _pager[page];_pager.CurrentPage;
public void RunNext() => _pager.Next();
{public void Prev() => _pager.Prev();
public IGrouping<int, T> this[int varpage] pageWidth=> =_pager[page];
Console.WindowWidth - 1; public void Run()
{
var currentPagepageWidth = Console.WindowWidth - 1;
var keyInfo = new ConsoleKeyInfo();
do
{
if (keyInfo.Key == ConsoleKey.RightArrow || keyInfo.Key == (ConsoleKey)0 || keyInfo.Key == ConsoleKey.LeftArrow)
{
if (keyInfo.Key == ConsoleKey.RightArrow && currentPage_pager.PageIndex < _pager.PageCount - 1)
{
currentPage++;_pager.Next();
}
else if (keyInfo.Key == ConsoleKey.LeftArrow && currentPage_pager.PageIndex > 1)
{
currentPage--_pager.Prev();
}
Console.Clear();
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.DarkRed;
var headerText = string.Format("Page:[{0}]/[{1}] │ Records:[{2}] ║ [◄] Previous │ [►] Next │ [Esc] Escape", currentPage_pager.PageIndex + 1, _pager.PageCount, _pager[currentPage]_pager.CurrentPage.Count());
Console.WriteLine(headerText.PadRight(Console.BufferWidth - 1, ' '));
Console.ResetColor();
foreach (var item in _pager[currentPage - 1]_pager.CurrentPage)
{
var row = item.ToString();
if (row.Length > pageWidth)
{
row = row.Substring(0, pageWidth);
}
Console.WriteLine(row);
}
}
keyInfo = Console.ReadKey(true);
} while (keyInfo.Key != ConsoleKey.Escape);
}
}
public static IEnumerable<IGrouping<int, T>> GroupByPage<T>(this IEnumerable<T> values, int pageSize)
{
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
return values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
First we create an interface (you can also add page index and next/prev methods):
public interface IPager<out T>
{
int PageSize { get; }
int PageCount { get; }
IGrouping<int, T> this[int page] { get; }
}
public class Pager<T> : IPager<T>
{
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
}
public class ConsolePager<T> : IPager<T>
{
private readonly IPager<T> _pager;
public ConsolePager(IPager<T> pager)
{
_pager = pager;
}
public int PageSize => _pager.PageSize;
public int PageCount => _pager.PageCount;
public IGrouping<int, T> this[int page] => _pager[page];
public void Run()
{
var pageWidth = Console.WindowWidth - 1;
var currentPage = 1;
var keyInfo = new ConsoleKeyInfo();
do
{
if (keyInfo.Key == ConsoleKey.RightArrow || keyInfo.Key == (ConsoleKey)0 || keyInfo.Key == ConsoleKey.LeftArrow)
{
if (keyInfo.Key == ConsoleKey.RightArrow && currentPage < _pager.PageCount)
{
currentPage++;
}
else if (keyInfo.Key == ConsoleKey.LeftArrow && currentPage > 1)
{
currentPage--;
}
Console.Clear();
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.DarkRed;
var headerText = string.Format("Page:[{0}]/[{1}] │ Records:[{2}] ║ [◄] Previous │ [►] Next │ [Esc] Escape", currentPage, _pager.PageCount, _pager[currentPage].Count());
Console.WriteLine(headerText.PadRight(Console.BufferWidth - 1, ' '));
Console.ResetColor();
foreach (var item in _pager[currentPage - 1])
{
var row = item.ToString();
if (row.Length > pageWidth)
{
row = row.Substring(0, pageWidth);
}
Console.WriteLine(row);
}
}
keyInfo = Console.ReadKey(true);
} while (keyInfo.Key != ConsoleKey.Escape);
}
}
public static IEnumerable<IGrouping<int, T>> GroupByPage<T>(this IEnumerable<T> values, int pageSize)
{
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
return values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v)
.ToList();
}
First we create an interface:
public interface IPager<out T>
{
int PageIndex { get; }
int PageSize { get; }
int PageCount { get; }
IGrouping<int, T> CurrentPage { get; }
IGrouping<int, T> this[int page] { get; }
void Next();
void Prev();
}
public class Pager : IPager { private int _pageIndex;
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageIndex => _pageIndex;
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
public IGrouping<int, T> CurrentPage => this[_pageIndex];
public void Next() => _pageIndex++;
public void Prev() => _pageIndex--;
}
public class ConsolePager<T> : IPager<T>
{
private readonly IPager<T> _pager;
public ConsolePager(IPager<T> pager)
{
_pager = pager;
}
public int PageIndex => _pager.PageIndex;
public int PageSize => _pager.PageSize;
public int PageCount => _pager.PageCount;
public IGrouping<int, T> CurrentPage => _pager.CurrentPage;
public void Next() => _pager.Next();
public void Prev() => _pager.Prev();
public IGrouping<int, T> this[int page] => _pager[page];
public void Run()
{
var pageWidth = Console.WindowWidth - 1;
var keyInfo = new ConsoleKeyInfo();
do
{
if (keyInfo.Key == ConsoleKey.RightArrow || keyInfo.Key == (ConsoleKey)0 || keyInfo.Key == ConsoleKey.LeftArrow)
{
if (keyInfo.Key == ConsoleKey.RightArrow && _pager.PageIndex < _pager.PageCount - 1)
{
_pager.Next();
}
else if (keyInfo.Key == ConsoleKey.LeftArrow && _pager.PageIndex > 1)
{
_pager.Prev();
}
Console.Clear();
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.DarkRed;
var headerText = string.Format("Page:[{0}]/[{1}] │ Records:[{2}] ║ [◄] Previous │ [►] Next │ [Esc] Escape", _pager.PageIndex + 1, _pager.PageCount, _pager.CurrentPage.Count());
Console.WriteLine(headerText.PadRight(Console.BufferWidth - 1, ' '));
Console.ResetColor();
foreach (var item in _pager.CurrentPage)
{
var row = item.ToString();
if (row.Length > pageWidth)
{
row = row.Substring(0, pageWidth);
}
Console.WriteLine(row);
}
}
keyInfo = Console.ReadKey(true);
} while (keyInfo.Key != ConsoleKey.Escape);
}
}
Here's another example with a decorator:
First we create an interface (you can also add page index and next/prev methods):
public interface IPager<out T>
{
int PageSize { get; }
int PageCount { get; }
IGrouping<int, T> this[int page] { get; }
}
Then we create a general pager:
public class Pager<T> : IPager<T>
{
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
}
Now we create another pager but this time it can display the item in the console:
public class ConsolePager<T> : IPager<T>
{
private readonly IPager<T> _pager;
public ConsolePager(IPager<T> pager)
{
_pager = pager;
}
public int PageSize => _pager.PageSize;
public int PageCount => _pager.PageCount;
public IGrouping<int, T> this[int page] => _pager[page];
public void Run()
{
var pageWidth = Console.WindowWidth - 1;
var currentPage = 1;
var keyInfo = new ConsoleKeyInfo();
do
{
if (keyInfo.Key == ConsoleKey.RightArrow || keyInfo.Key == (ConsoleKey)0 || keyInfo.Key == ConsoleKey.LeftArrow)
{
if (keyInfo.Key == ConsoleKey.RightArrow && currentPage < _pager.PageCount)
{
currentPage++;
}
else if (keyInfo.Key == ConsoleKey.LeftArrow && currentPage > 1)
{
currentPage--;
}
Console.Clear();
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.DarkRed;
var headerText = string.Format("Page:[{0}]/[{1}] │ Records:[{2}] ║ [◄] Previous │ [►] Next │ [Esc] Escape", currentPage, _pager.PageCount, _pager[currentPage].Count());
Console.WriteLine(headerText.PadRight(Console.BufferWidth - 1, ' '));
Console.ResetColor();
foreach (var item in _pager[currentPage - 1])
{
var row = item.ToString();
if (row.Length > pageWidth)
{
row = row.Substring(0, pageWidth);
}
Console.WriteLine(row);
}
}
keyInfo = Console.ReadKey(true);
} while (keyInfo.Key != ConsoleKey.Escape);
}
}
Usage:
new ConsolePager<int>(
new Pager<int>(Enumerable.Range(1, 1000),
Console.WindowHeight - 2)
).Run();
Here's another example with a decorator:
First we create an interface (you can also add page index and next/prev methods):
public interface IPager<out T>
{
int PageSize { get; }
int PageCount { get; }
IGrouping<int, T> this[int page] { get; }
}
Then we create a general pager:
public class Pager<T> : IPager<T>
{
private readonly IEnumerable<IGrouping<int, T>> _pages;
public Pager(IEnumerable<T> values, int pageSize)
{
PageSize = pageSize;
var currentPage = 0;
var page = new Func<int, int>(index => index > 0 && index % pageSize == 0 ? ++currentPage : currentPage);
_pages = values
.Select((v, i) => new { v, i })
.GroupBy(x => page(x.i), x => x.v);
}
public int PageSize { get; }
public int PageCount => _pages.Count();
public IGrouping<int, T> this[int page] => _pages.ElementAtOrDefault(page);
}
Now we create another pager but this time it can display the item in the console:
public class ConsolePager<T> : IPager<T>
{
private readonly IPager<T> _pager;
public ConsolePager(IPager<T> pager)
{
_pager = pager;
}
public int PageSize => _pager.PageSize;
public int PageCount => _pager.PageCount;
public IGrouping<int, T> this[int page] => _pager[page];
public void Run()
{
var pageWidth = Console.WindowWidth - 1;
var currentPage = 1;
var keyInfo = new ConsoleKeyInfo();
do
{
if (keyInfo.Key == ConsoleKey.RightArrow || keyInfo.Key == (ConsoleKey)0 || keyInfo.Key == ConsoleKey.LeftArrow)
{
if (keyInfo.Key == ConsoleKey.RightArrow && currentPage < _pager.PageCount)
{
currentPage++;
}
else if (keyInfo.Key == ConsoleKey.LeftArrow && currentPage > 1)
{
currentPage--;
}
Console.Clear();
Console.BackgroundColor = ConsoleColor.White;
Console.ForegroundColor = ConsoleColor.DarkRed;
var headerText = string.Format("Page:[{0}]/[{1}] │ Records:[{2}] ║ [◄] Previous │ [►] Next │ [Esc] Escape", currentPage, _pager.PageCount, _pager[currentPage].Count());
Console.WriteLine(headerText.PadRight(Console.BufferWidth - 1, ' '));
Console.ResetColor();
foreach (var item in _pager[currentPage - 1])
{
var row = item.ToString();
if (row.Length > pageWidth)
{
row = row.Substring(0, pageWidth);
}
Console.WriteLine(row);
}
}
keyInfo = Console.ReadKey(true);
} while (keyInfo.Key != ConsoleKey.Escape);
}
}
Usage:
new ConsolePager<int>(
new Pager<int>(Enumerable.Range(1, 1000),
Console.WindowHeight - 2)
).Run();