【问题标题】:The simplest formula to calculate page count?计算页数的最简单公式?
【发布时间】:2010-12-09 08:01:46
【问题描述】:

我有一个数组,我想根据预设的页面大小将它们分成页面。

我就是这样做的:

private int CalcPagesCount()
{
    int  totalPage = imagesFound.Length / PageSize;

    // add the last page, ugly
    if (imagesFound.Length % PageSize != 0) totalPage++;
    return totalPage;
}

感觉计算不是最简单的(我数学不好),能不能给个更简单的计算公式?

【问题讨论】:

  • imo,感觉“丑陋”的不是你有一个“if”,而是你第一次计算的“totalPage”不是实际的总页数,你必须在互补演算中“修补”它。请参阅下面的答案,它只添加语义代码。

标签: c# pagination


【解决方案1】:
var pageCount = (int)Math.Ceiling((float)_collection.Count / (float)_itemsPerPage);

说明:

集合中的项目数除以每页的项目数。然后使用 Math.Ceiling 将此数字四舍五入到最接近的整数。

例如“书”中的 7 项 / 每页 3 项 = 2.33。 2.33 向上取整到最接近的 int = 3。

【讨论】:

    【解决方案2】:

    一直使用这个公式:

    int totalPages = items.Count / pageSize + (items.Count % pageSize > 0 ? 1 : 0);
    

    【讨论】:

      【解决方案3】:

      只是语义代码,它明确了部分结果,并使任何读者都能清楚地了解计算出的内容。我更喜欢这个紧凑的公式:

          private int calculateNbPages(int nbResults, int pageSize)
              {
                  int  nbFullyFilledPages = nbResults / pageSize;
                  int nbPartiallyFilledPages = (nbResults % pageSize == 0) ? 0 : 1;
                  
                  return nbFullyFilledPages + nbPartiallyFilledPages;
              }
      

      【讨论】:

        【解决方案4】:

        以下对我有用:

        if(totalRecords%value === 0){
          count = (totalRecords) / value;
        }
        else {
          count = Math.floor((totalRecords + value - 1) / value);
        }
        

        【讨论】:

          【解决方案5】:

          以下是计算列表中分页的工作代码:

                        int i = 0;
                        int pagecount = 0;
                        int pageSize = 50;
          

          列表项=新列表(); 要做的事情:在列表中添加项目:

                        if (Items.Count() != 0)
                        {
                              int pageNumber = Total Records / 50;
          
                                    for (int num = 0; numi < pageNumber; num++)
                                    {
                                          var x = Items.Skip(i * pageSize).Take(pageSize);
                                          i++;
                                    }
          
                              var y = Items.Skip(i * pageSize).Take(pageSize);
                        }
          

          【讨论】:

            【解决方案6】:

            OP 包含一个有效的答案。如果我想关闭分页,那么我可以设置PageSize = int.MaxValue

            这里有几个答案添加到PageSize (imagesFound.Length + PageSize),这可能会导致溢出。这会导致错误的结果。

            这是我要使用的代码:

            int imageCount = imagesFound.Length;
            
            // include this if when you always want at least 1 page 
            if (imageCount == 0)
            {
                return 1;
            }
            
            return imageCount % PageSize != 0 
                ? imageCount / PageSize + 1 
                : imageCount / PageSize;
            

            【讨论】:

              【解决方案7】:

              我自己写的:

              private int GetPageCount(int count, int pageSize)
              {
                  int result = 0;
              
                  if(count > 0)
                  {
                      result = count / pageSize;
                      if(result > 0 && (count > (pageSize * result)))
                      {
                         result++;
                      }
                  }
              
                  return result;
              }
              

              (当然,不要将pageSize 设置为int.MaxValue

              【讨论】:

                【解决方案8】:
                1. 您可以在 Sql Server 中获取总页数:-
                DECLARE @PageCount INT;
                DECLARE @NoOfData INT;
                SET @NoOfData = (select Count(*) AS [PageCount] from YourTableName)
                SET @PageCount=((@NoOfData+@PageSize-1)/@PageSize)
                SELECT @PageCount AS [PageCount]
                
                1. 您可以输入您的代码-
                int totalPage = (int) Math.Ceiling((double) imagesFound.Length / PageSize);
                
                

                【讨论】:

                  【解决方案9】:

                  注意:如果页面大小 > 1,您将始终获得至少 1 页,即使计数为 0,这是我需要的,但可能不是您需要的。页面大小为 1(愚蠢但在技术上有效)和计数为 0 将是零页。根据您的需要,您可能需要检查计数和页面大小为 1 的零值

                  int pages = ((count - 1) / PAGESIZE) + 1;
                  

                  【讨论】:

                  • 是的,更简单。更简单但错误。如果 count = 0 那么 pages = 1
                  • @Pevel Melnikov 。我想在纯粹的迂腐意义上这是错误的,但这取决于上下文。在我使用它的代码中,我总是想要至少 1 页(即使有 0 个项目,0 页也是无效的)。我至少应该添加一个注释。
                  • @PavelMelnikov,这并不完全是错误的。只是取决于你想如何看待它。但是,它总是返回至少 1 页的假设是不正确的。 0 条记录和 1 的页面大小将导致 0。因此,要么不允许页面大小为 0,要么进行检查。
                  【解决方案10】:

                  为避免页码出现错误,我能想到的计算 noOfPages 的最佳方法是执行以下行

                  totalPage = Math.Ceiling(imagesFound.Length / PageSize);
                  

                  当 PageSize == imagesFound.Length 时,这不应该给你第 2 页

                  【讨论】:

                  • 我不认为这是有效的。如果您有 3 的长度和 2 的页面大小,您会期望 2 页(第一页有 2 个项目,第二页有 1 个)。这样做会给你 (3-1)/2 = 1 页。
                  • 修改了原始帖子以适应这一点,感谢您的关注
                  【解决方案11】:

                  实际上,你已经接近你能做的最好的了。关于我能想到的唯一可能“更好”的事情是这样的:

                  totalPage = (imagesFound.Length + PageSize - 1) / PageSize;
                  

                  这更好的唯一原因是你避免了 if 语句。

                  【讨论】:

                  • 危险...这会导致PageSize = int.MaxValue 时溢出。我添加了一个不易溢出的答案。
                  【解决方案12】:

                  强制四舍五入:

                  totalPage = (imagesFound.Length + PageSize - 1) / PageSize;
                  

                  或使用浮点数学:

                  totalPage = (int) Math.Ceiling((double) imagesFound.Length / PageSize);
                  

                  【讨论】:

                  • 危险...这会导致PageSize = int.MaxValue 时溢出。我添加了一个不易溢出的答案。
                  • 为避免溢出,您可以重构公式以获得:((imagesFound.Length - 1) / PageSize) + 1
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-11-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-12-18
                  相关资源
                  最近更新 更多