C# 生成api仅提供偏移量的第一个/下一个/上一个/最后一个链接

C# 生成api仅提供偏移量的第一个/下一个/上一个/最后一个链接,c#,asp.net,C#,Asp.net,我正在尝试编写一些代码,它接受一个偏移量值,然后生成first/next/prev/last链接 我现在有一些类似于下面的东西,但我一直在考虑边缘情况,我的计算结果出现了偏差。我想一定有人在某个地方做过这件事,但找不到库来查看/使用 public class PagedItems<T> { public PagedItems() { } public PagedItems(int offset, int totalSize, IEnumerable&

我正在尝试编写一些代码,它接受一个
偏移量
值,然后生成first/next/prev/last链接

我现在有一些类似于下面的东西,但我一直在考虑边缘情况,我的计算结果出现了偏差。我想一定有人在某个地方做过这件事,但找不到库来查看/使用

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; }
}
公共类页面数据项
{
公共页面数据项()
{
}
公共页面数据项(整数偏移量、整数总大小、IEnumerable子集)
{
这个偏移量=偏移量;
this.TotalSize=TotalSize;
数据=子集;
this.Links=新字典();
var pageCount=(totalSize-offset)/20;
如果(偏移量>20)
{
Add(“prev”,新Uri($”/accounts?skip={offset-20}”);
}
if(偏移量<(总尺寸-偏移量))
{
Add(“last”,新Uri($”/accounts/skip={totalSize-20}”);
}
}
公共整数偏移量{get;}
public int Size=>this.Data.Count();
公共整数TotalSize{get;}
公共IEnumerable数据{get;}
公共字典链接{get;}
}

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

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; }
}
公共类页面数据项
{
私有只读int pageSize;
公共页面数据项()
{
}
公共PagedItems(int偏移量、int pageSize、int totalSize、IEnumerable子集、Uri baseUri)
{
这个偏移量=偏移量;
this.pageSize=页面大小;
this.TotalSize=TotalSize;
数据=子集;
this.Links=新字典();
如果(应显示PrevandFirstLink(偏移))
{
var linkValue=Math.Max(偏移量-页面大小,0);
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,linkValue.ToString());
此.Links.Add(“prev”,link);
}
if(shouldldisplaynextandlastlink(偏移量、总大小、页面大小))
{
var linkValue=偏移量+页面大小;
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,linkValue.ToString());
this.Links.Add(“下一步”,link);
}
如果(应显示PrevandFirstLink(偏移))
{
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,“0”);
添加(“第一”,链接);
}
if(shouldldisplaynextandlastlink(偏移量、总大小、页面大小))
{
var linkValue=totalSize-pageSize;
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,linkValue.ToString());
this.Links.Add(“last”,link);
}
}
私有静态bool应该显示nextandlastlink(intoffset,inttotalsize,intpagesize)=>offsetoffset>0;
公共整数偏移量{get;}
public int Size=>this.Data.Count();
公共整数TotalSize{get;}
公共IEnumerable数据{get;}
公共字典链接{get;}
}

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

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; }
}
公共类页面数据项
{
私有只读int pageSize;
公共页面数据项()
{
}
公共PagedItems(int偏移量、int pageSize、int totalSize、IEnumerable子集、Uri baseUri)
{
这个偏移量=偏移量;
this.pageSize=页面大小;
this.TotalSize=TotalSize;
数据=子集;
this.Links=新字典();
如果(应显示PrevandFirstLink(偏移))
{
var linkValue=Math.Max(偏移量-页面大小,0);
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,linkValue.ToString());
此.Links.Add(“prev”,link);
}
if(shouldldisplaynextandlastlink(偏移量、总大小、页面大小))
{
var linkValue=偏移量+页面大小;
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,linkValue.ToString());
this.Links.Add(“下一步”,link);
}
如果(应显示PrevandFirstLink(偏移))
{
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,“0”);
添加(“第一”,链接);
}
if(shouldldisplaynextandlastlink(偏移量、总大小、页面大小))
{
var linkValue=totalSize-pageSize;
var link=queryhelp.AddQueryString(baseUri.OriginalString,“skip”,linkValue.ToString());
this.Links.Add(“last”,link);
}
}
私有静态bool应该显示nextandlastlink(intoffset,inttotalsize,intpagesize)=>offsetoffset>0;
公共整数偏移量{get;}
public int Size=>this.Data.Count();
公共整数TotalSize{get;}
公共IEnumerable数据{get;}
公共字典链接{get;}
}

对您的问题没有帮助,但我认为这个类做得太多了-它不应该包含任何与URL有关的内容,URL应该在您的表示层中。这个类是从APISo返回的?这仍然与表示层无关。您是否正在尝试实现OData提供程序?无论如何,这可能会有帮助:@DavidG没有表示层。响应显示了要遵循APISo的数据和链接子集,这对您的问题没有帮助,但我认为这个类试图做的太多了-它不应该包含任何与URL有关的内容,URL应该在您的表示层中。这个类是从APISo返回的?这仍然与表示层无关。您是否正在尝试实现OData提供程序?无论如何,这可能会有帮助:@DavidG没有表示层。响应显示了要遵循api的数据和链接的子集