Pagination of IEnumerable<T>
유니티 & C#2020. 9. 29. 15:18
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public struct Page<T> : IEnumerable<T> | |
{ | |
private IEnumerable<T> source; | |
private IEnumerable<T> items; | |
private int pageIndex; | |
private int countPerPage; | |
private int maxPage; | |
public Page(IEnumerable<T> source, int pageIndex, int countPerPage) | |
{ | |
this.source = source; | |
this.items = source.Skip(pageIndex * countPerPage).Take(countPerPage); | |
this.pageIndex = pageIndex; | |
this.countPerPage = countPerPage; | |
this.maxPage = (int)Math.Ceiling(source.Count() / (double)countPerPage); | |
} | |
public int PageIndex => pageIndex; | |
public int PageNumber => pageIndex + 1; | |
public int CountPerPage => countPerPage; | |
public int MaxPage => maxPage; | |
public bool IsFirstPage => PageIndex == 0; | |
public bool IsLastPage => PageNumber == MaxPage; | |
public Page<T> GetNextPage() | |
{ | |
if (IsLastPage) | |
{ | |
return this; | |
} | |
return new Page<T>(source, pageIndex + 1, countPerPage); | |
} | |
public Page<T> GetPrevPage() | |
{ | |
if (IsFirstPage) | |
{ | |
return this; | |
} | |
return new Page<T>(source, pageIndex - 1, countPerPage); | |
} | |
public IEnumerator<T> GetEnumerator() | |
{ | |
return items.GetEnumerator(); | |
} | |
IEnumerator IEnumerable.GetEnumerator() | |
{ | |
return items.GetEnumerator(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static class PaginationExtensions | |
{ | |
public static IEnumerable<Page<T>> GetPages<T>(this IEnumerable<T> source, int countPerPage) | |
{ | |
return Enumerable.Range(0, source.GetPageCount(countPerPage)).Select(index => new Page<T>(source, index, countPerPage)); | |
} | |
public static Page<T> GetPage<T>(this IEnumerable<T> source, int currentPage, int countPerPage) | |
{ | |
return new Page<T>(source, currentPage, countPerPage); | |
} | |
public static int GetPageCount<T>(this IEnumerable<T> source, int countPerPage) | |
{ | |
return (int)Math.Ceiling(source.Count() / (double)countPerPage); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
namespace CSharp | |
{ | |
class Program | |
{ | |
static void Main(string[] args) | |
{ | |
List<Item> items = new List<Item>() | |
{ | |
new Item("1", 10), | |
new Item("2", 1), | |
new Item("3", 1), | |
new Item("4", 1), | |
new Item("5", 1), | |
new Item("6", 106), | |
new Item("7", 1), | |
new Item("8", 1), | |
new Item("9", 1), | |
new Item("0", 1), | |
new Item("1", 10), | |
new Item("2", 1), | |
new Item("3", 1), | |
new Item("4", 1), | |
new Item("5", 1), | |
new Item("6", 106), | |
new Item("7", 1), | |
new Item("8", 1), | |
new Item("9", 1), | |
new Item("0", 1), | |
new Item("1", 10), | |
new Item("2", 1), | |
new Item("3", 1), | |
new Item("4", 1), | |
new Item("5", 1), | |
new Item("6", 106), | |
new Item("7", 1), | |
new Item("8", 1), | |
new Item("9", 1), | |
new Item("0", 1), | |
new Item("1", 10), | |
new Item("2", 1), | |
new Item("3", 1), | |
new Item("4", 1), | |
new Item("5", 1), | |
new Item("6", 106), | |
new Item("7", 1), | |
new Item("8", 1), | |
new Item("9", 1), | |
new Item("0", 1), | |
}; | |
foreach (var page in items.GetPages(countPerPage: 9)) | |
{ | |
Console.WriteLine($"Page - {page.PageNumber} -"); | |
foreach (var item in page) | |
{ | |
Console.WriteLine($"{item.name}:{item.stack}"); | |
} | |
Console.WriteLine(); | |
} | |
} | |
} | |
} |
'유니티 & C#' 카테고리의 다른 글
유니티 Android SDK 업데이트 (0) | 2020.10.03 |
---|---|
유니티에서 다국어 폰트 지원하는 방법 (1) | 2020.10.01 |
BundleTool - 유니티에서 빌드된 aab 파일을 안드로이드에 설치 (0) | 2020.09.20 |
RepeatButton 누르고 있는 동안 이벤트가 반복 발생하는 버튼 (0) | 2020.08.30 |
유니티에서 컴파일러 Warning 로그 제거하기 (0) | 2020.07.13 |
댓글()