Skip to main content
Code Review

Return to Answer

added 1 character in body
Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190

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--;
}
added 521 characters in body
Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190
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);
 }
}
added 3375 characters in body
Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190

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();
added 535 characters in body
Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190
Loading
Source Link
t3chb0t
  • 44.6k
  • 9
  • 84
  • 190
Loading
lang-cs

AltStyle によって変換されたページ (->オリジナル) /