Collections Data Structure C#

using System.Linq;
namespace System.Collections.Generic {
  public class PagedList : List, IPagedList {
    public static int DefaultPageSize { get { return 10; } }
    private IEnumerable _sourceList = null;
    private int _pageSize = DefaultPageSize;
    private int _pageIndex = 0;
    //public PagedList() : base() { }
    public PagedList(IEnumerable sourceList = null)
      : base() {
      _sourceList = sourceList;
      RefreshDisplayedRows();
    }
    public IEnumerable SourceList {
      get { return _sourceList; }
      set {
        _sourceList = value;
        RefreshDisplayedRows();
      }
    }
    public int PageSize {
      get { return _pageSize; }
      set {
        _pageSize = (value < 0 ? 0 : value);
        RefreshDisplayedRows();
      }
    }
    public int TotalCount { get { return _sourceList == null ? 0 : _sourceList.Count(); } }
    public int PageCount { get { return _pageSize == 0 ? 1 : ((int)(TotalCount / _pageSize) + (TotalCount % _pageSize == 0 ? 0 : 1)); } }
    public int PageIndex { get { return _pageIndex; } set { SetPage(value); } }
    private void SetPage(int pageIndex) {
      if (TotalCount == 0 || pageIndex < 0) _pageIndex = 0;
      else if (pageIndex > (PageCount - 1)) _pageIndex = (PageCount - 1);
      else _pageIndex = pageIndex;
      RefreshDisplayedRows();
    }
    private void RefreshDisplayedRows() {
      Clear();
      if (_sourceList != null) AddRange(_sourceList.Skip(_pageIndex * _pageSize).Take(_pageSize).ToList());
    }
    public bool HasPreviousPage { get { return PageIndex > 0; } }
    public bool HasNextPage { get { return PageIndex < (PageCount - 1); } }
    public void GetFirstPage() { if (HasPreviousPage) SetPage(0); }
    public void GetPreviousPage() { if (HasPreviousPage) SetPage(PageIndex - 1); }
    public void GetNextPage() { if (HasNextPage) SetPage(PageIndex + 1); }
    public void GetLastPage() { if (HasNextPage) SetPage(PageCount - 1); }
    public int PageIndexOf(T item) {
      var index = _sourceList.ToList().IndexOf(item);
      if (index < 0) return -1;
      return ((int)((index + 1) / _pageSize) + ((index + 1) % _pageSize == 0 ? 0 : 1)) - 1;
    }
    //public int LastPageOf(T item) {
    //    var index = _sourceList.ToList().LastIndexOf(item);
    //    if (index < 0) return -1;
    //    return (int)((index + 1) / _pageSize) + ((index + 1) % _pageSize == 0 ? 0 : 1);
    //}
    public void ShowPageOf(T item) {
      var pageIndex = PageIndexOf(item);
      if (pageIndex < 0) return;
      SetPage(pageIndex);
    }
    //public void ShowLastPageOf(T item) {
    //    var pageIndex = LastPageOf(item);
    //    if (pageIndex < 0) return;
    //    SetPage(pageIndex);
    //}
    public bool IsVisible(T item) {
      return _pageIndex == PageIndexOf(item);// || PageIndex == LastPageOf(item));
    }
  }
}
namespace System.Collections.Generic {
  public interface IPagedList : IList {
    int PageSize { get; set; }
    int TotalCount { get; }
    int PageCount { get; }
    int PageIndex { get; set; }
    //void SetPage(int pageIndex);
    bool HasPreviousPage { get; }
    bool HasNextPage { get; }
    void GetFirstPage();
    void GetPreviousPage();
    void GetNextPage();
    void GetLastPage();
    int PageIndexOf(T item);
    void ShowPageOf(T item);
    //int LastPageOf(T item);
    //void ShowLastPageOf(T item);
    bool IsVisible(T item);
  }
}