为了账号安全,请及时绑定邮箱和手机立即绑定

生成第一个/下一个/上一个/最后一个链接,其中 api 仅提供偏移量

生成第一个/下一个/上一个/最后一个链接,其中 api 仅提供偏移量

C#
慕森卡 2022-10-15 14:33:03
我正在尝试编写一些带有offset值的代码,然后生成第一个/下一个/上一个/最后一个链接。我目前有类似下面的内容,但一直在考虑边缘情况,我的计算结果出现了偏差。我想有人一定已经在某个地方做过这个,但找不到可以查看/使用的库。public class PagedItems<T>{    public PagedItems()    {    }    public PagedItems(int offset, int totalSize, IEnumerable<T> subset)    {        this.Offset = offset;        this.TotalSize = totalSize;        this.Data = subset;        this.Links = new Dictionary<string, Uri>();        var pageCount = (totalSize - offset) / 20;        if (offset > 20)        {            this.Links.Add("prev", new Uri($"/accounts?skip={offset - 20}"));        }        if (offset < (totalSize - offset))        {            this.Links.Add("last", new Uri($"/accounts/skip={totalSize - 20}"));        }    }    public int Offset { get; }    public int Size => this.Data.Count();    public int TotalSize { get; }    public IEnumerable<T> Data { get; }    public Dictionary<string, Uri> Links { get; }}
查看完整描述

1 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

对于任何想要这个的人,我可以使用此代码和围绕逻辑进行单元测试:


public class PagedItems<T>

{

    private readonly int pageSize;


    public PagedItems()

    {

    }


    public PagedItems(int offset, int pageSize, int totalSize, IEnumerable<T> subset, Uri baseUri)

    {

        this.Offset = offset;

        this.pageSize = pageSize;

        this.TotalSize = totalSize;

        this.Data = subset;

        this.Links = new Dictionary<string, string>();


        if (ShouldDisplayPrevAndFirstLink(offset))

        {

            var linkValue = Math.Max(offset - pageSize, 0);


            var link = QueryHelpers.AddQueryString(baseUri.OriginalString, "skip", linkValue.ToString());


            this.Links.Add("prev", link);

        }


        if (ShouldDisplayNextAndLastLink(offset, totalSize, pageSize))

        {

            var linkValue = offset + pageSize;


            var link = QueryHelpers.AddQueryString(baseUri.OriginalString, "skip", linkValue.ToString());


            this.Links.Add("next", link);

        }


        if (ShouldDisplayPrevAndFirstLink(offset))

        {

            var link = QueryHelpers.AddQueryString(baseUri.OriginalString, "skip", "0");


            this.Links.Add("first", link);

        }


        if (ShouldDisplayNextAndLastLink(offset, totalSize, pageSize))

        {

            var linkValue = totalSize - pageSize;


            var link = QueryHelpers.AddQueryString(baseUri.OriginalString, "skip", linkValue.ToString());


            this.Links.Add("last", link);

        }

    }


    private static bool ShouldDisplayNextAndLastLink(int offset, int totalSize, int pageSize) => offset < totalSize - pageSize;


    private static bool ShouldDisplayPrevAndFirstLink(int offset) => offset > 0;


    public int Offset { get; }


    public int Size => this.Data.Count();


    public int TotalSize { get; }


    public IEnumerable<T> Data { get; }


    public Dictionary<string, string> Links { get; }

}


查看完整回答
反对 回复 2022-10-15
  • 1 回答
  • 0 关注
  • 75 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号