Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 没有得到正确的数字序列_C#_Loops_Pagination - Fatal编程技术网

C# 没有得到正确的数字序列

C# 没有得到正确的数字序列,c#,loops,pagination,C#,Loops,Pagination,我正在一个oracle sql调用中编写分页功能,该调用使用了OFFSET x ROWS FETCH NEXT y ROWS ONLY功能,我不知道如何在不使用重复数字的情况下调用它 目前我在C端做类似的事情,\u currooffset是x,\u nextofset是y private int _currOffset = 0; private int _maxFetchCount = 499; private int _maxOffset = 2020; private int _nextOf

我正在一个oracle sql调用中编写分页功能,该调用使用了
OFFSET x ROWS FETCH NEXT y ROWS ONLY
功能,我不知道如何在不使用重复数字的情况下调用它

目前我在C端做类似的事情,
\u currooffset
x
\u nextofset
y

private int _currOffset = 0;
private int _maxFetchCount = 499;
private int _maxOffset = 2020;
private int _nextOffset = 0;

while(_currOffset < _maxOffset) {
    // If we are going to go over _maxOffset, just take the difference
    _nextOffset = (_currOffset + _maxFetchCount > _maxOffset) ? _maxOffset - _currOffset : _maxFetchCount;

    // Call Database using _currOffset and _nextOffset
    // .... OFFSET _currOffset ROWS FETCH NEXT _nextOffset ROWS ONLY

    _currOffset += _nextOffset + 1;
}
private int\u currOffset=0;
私有int_maxFetchCount=499;
私有整数_maxOffset=2020;
私有int_nextofset=0;
而(\u currooffset<\u maxOffset){
//如果我们要检查_maxOffset,只需取差
_NEXTOFSET=(\u currOffset+\u maxFetchCount>\u maxOffset)?\u maxOffset-\u currOffset:\u maxFetchCount;
//使用_currOffset和_nextofset调用数据库
//..偏移量\u currOffset行仅获取下一个\u nextofset行
_currOffset+=\u nextofset+1;
}
这在两次迭代中都很有效,因为第一次
\u currooffset
0
\u nextofset
499
\u currooffset
500
\u nextofset
仍然是
499
第二次迭代

对于第三次迭代,currOffset现在是
501
,这是错误的。它应该保持
1+

我基本上希望在不重复偏移量的情况下分块查询

  • 0
    查询到
    499

  • 500
    查询到
    999

  • 1000
    查询到
    1499

  • 1500
    查询到
    1999

  • 1999
    查询到
    2020
    (在这种情况下,if条件将
    \u nextofset
    设置为
    21


  • 如何更改变量的赋值以处理此问题?我不能只删除
    \u curroOffset+=\u nextofset+1
    ,因为我会在sql查询中查询同一个偏移量两次。(第一次迭代以
    499
    结束,第二次迭代以
    499
    开始,当我想第二次迭代以
    500
    开始时)

    可以改变一些事情,让你得到你想要的值:

    • 只要
      start
      值为
      lastItem
      while
      条件运行,以便在大小中包含第一个项目(例如,
      5-1
      4
      ,但从
      1
      5
      的项目数实际上为
      5
      ),因此
      size
      变成
      lastItem-start+1
    • 当我们显示(或设置一个变量)最后一个项目索引时,它被计算为
      start+size-1
      。例如,如果大小为
      2
      且起始项为
      5
      ,则最后一项为
      6
      5
      +
      2
      -
      1
    • 最后,我们只需将
      size
      添加到循环末尾的
      start
      值中

    代码示例

    private static void Main()
    {
        var start = 0;
        var maxSize = 500;
    
        // Note that this represents the last item's *index*
        // There are actually 2021 total items, since the first item is at index '0'
        var lastItem = 2020;  
    
        while (start <= lastItem)
        {
            int size = start + maxSize > lastItem 
                ? lastItem - start + 1
                : maxSize;
    
            Console.WriteLine($"Query from {start} to {start + size - 1} ({size} items)");
    
            start += size;
        }
    
        GetKeyFromUser("\nDone! Press any key to exit...");
    }
    
    private static void Main()
    {
    var start=0;
    var maxSize=500;
    //请注意,这表示最后一项的*索引*
    //实际上总共有2021个项目,因为第一个项目位于索引“0”处
    var lastItem=2020;
    while(启动最后一项)
    ?最后一项-开始+1
    :最大尺寸;
    WriteLine($“从{start}查询到{start+size-1}({size}项)”);
    开始+=大小;
    }
    GetKeyFromUser(“\n完成!按任意键退出…”);
    }
    
    请注意,我重命名了您的变量,因此代码更加精简。它们的映射如下:

    • \u currooffset=start
    • \u maxFetchCount=maxSize
    • \u maxOffset=lastItem
    • \u nextofset=size

    输出


    创建一个你期望代码做什么的心智模型。然后,开始调试。逐行逐行进行。在每行执行之前,问问自己“我期望这行代码做什么?”然后运行它。它做到了吗?如果没有,那就是你的错误。你的maxFetchCount是500,但你的第一个块(0-500)是501项。@hatchet你说得对,我想分块去
    500
    ,而不是
    0