using System;
using System.Collections.Generic;

namespace Dpz.Core.Web.Pager;

/// <summary>
/// 分页数据包装类
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagedListWarp<T>
{
    public PagedListWarp() { }

    public PagedListWarp(int currentPageIndex, int pageSize, int totalItemCount, List<T> items)
    {
        CurrentPageIndex = currentPageIndex;
        PageSize = pageSize;
        TotalItemCount = totalItemCount;
        Items = items;
    }

    /// <summary>
    /// 当前页索引
    /// </summary>
    public int CurrentPageIndex { get; set; }

    /// <summary>
    /// 每页显示的记录数
    /// </summary>
    public int PageSize { get; set; }

    /// <summary>
    /// 要分页的数据总数
    /// </summary>
    public int TotalItemCount { get; set; }

    /// <summary>
    /// 总页数
    /// </summary>
    public int TotalPageCount => (int)Math.Ceiling(TotalItemCount / (double)PageSize);

    /// <summary>
    /// 开始记录索引
    /// </summary>
    public int StartItemIndex => (CurrentPageIndex - 1) * PageSize + 1;

    /// <summary>
    /// 结束记录索引
    /// </summary>
    public int EndItemIndex =>
        TotalItemCount > CurrentPageIndex * PageSize ? CurrentPageIndex * PageSize : TotalItemCount;

    /// <summary>
    /// 当前页数据
    /// </summary>
    public List<T> Items { get; set; }

    /// <summary>
    /// 转换为PagedList对象
    /// </summary>
    /// <returns></returns>
    public PagedList<T> ToPagedList()
    {
        return new PagedList<T>(Items, CurrentPageIndex, PageSize, TotalItemCount);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个通用的分页数据包装类 PagedListWarp,用来在服务端或应用逻辑中承载分页相关的信息和当前页的数据。下面按部分说明其功能、行为和注意点。

主要职责

  • 保存分页参数与结果:CurrentPageIndex(当前页索引)、PageSize(每页条数)、TotalItemCount(总记录数)和当前页的 Items(数据集合)。
  • 提供与分页相关的计算属性:TotalPageCount、StartItemIndex、EndItemIndex。
  • 提供一个转换方法 ToPagedList,把当前包装转换为另一个类型 PagedList(假定项目中有该类)。

构造函数

  • 默认无参构造函数。
  • 带参构造函数:PagedListWarp(int currentPageIndex, int pageSize, int totalItemCount, List items),用于一次性初始化所有字段。

公开属性与含义

  • CurrentPageIndex:当前页索引(代码按 1 为第一页的习惯来计算)。
  • PageSize:每页显示的记录数。
  • TotalItemCount:要分页的数据总数。
  • Items:当前页的数据(List)。

计算属性

  • TotalPageCount => (int)Math.Ceiling(TotalItemCount / (double)PageSize)
    • 总页数,使用向上取整确保部分页也计为一页。
  • StartItemIndex => (CurrentPageIndex - 1) * PageSize + 1
    • 当前页的首条记录的全局索引(基于 1 的索引)。例如第 1 页时为 1,第 2 页时为 PageSize + 1。
  • EndItemIndex => TotalItemCount > CurrentPageIndex * PageSize ? CurrentPageIndex * PageSize : TotalItemCount
    • 当前页的末条记录的全局索引(取当前页末尾或总数中较小者)。

方法

  • ToPagedList():把本包装转换为 PagedList 实例(需要项目中存在 PagedList 的实现),构造器参数顺序为 Items, CurrentPageIndex, PageSize, TotalItemCount。

使用示例

  • 假设 pageIndex=2, pageSize=10, total=35,则:
    • TotalPageCount = 4
    • StartItemIndex = 11
    • EndItemIndex = 20

注意事项和改进建议

  • PageSize 为 0 会导致 TotalPageCount 抛出除以 0 异常,应在构造或属性访问前验证并确保 PageSize > 0。
  • CurrentPageIndex 小于 1 时,StartItemIndex 可能为非正数,建议约束 CurrentPageIndex >= 1。
  • TotalItemCount 负值不合理,建议保证 TotalItemCount >= 0。
  • Items 可能为 null,实际使用时可将其默认为空列表以避免空引用。
  • ToPagedList() 依赖外部的 PagedList 类型,需确保该类型的存在和构造签名一致。

可选改进示例(伪代码)

  • 在构造函数或属性里做参数验证/修正(把 PageSize <= 0 改为 1 或抛出异常;把 CurrentPageIndex < 1 改为 1 等)。
  • 将 Items 初始化为 new List() 以避免 null。

总之,这个类是一个典型的用于封装分页结果的 DTO/VO,提供了方便获取总页数、当前页起止记录索引和把数据转换为其他分页类型的方法。

评论加载中...