Найпростіша формула для розрахунку кількості сторінок?


79

У мене є масив, і я хочу розділити їх на сторінки відповідно до заданого розміру сторінки.

Ось як я роблю:

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

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

Я вважаю, що розрахунок не найпростіший (я погано працюю з математикою), чи можете ви дати одну простішу формулу розрахунку?

Відповіді:


183

Змусити його округлити:

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

Або використовуйте математику з плаваючою комою:

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

2
Небезпека ... це призводить до переповнення, коли PageSize = int.MaxValue. Я додав відповідь, яка не є вразливою до переповнення.
Джеремі

5
Щоб уникнути переповнення, ви можете просто ((imagesFound.Length - 1) / PageSize) + 1
переформатувати

21

Насправді, ви близькі до того, що можете зробити. Про єдине, що я можу придумати, що може бути "кращим", це приблизно таке:

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

І єдина причина, що це стає кращим, полягає в тому, що ви уникаєте твердження if.


Небезпека ... це призводить до переповнення, коли PageSize = int.MaxValue. Я додав відповідь, яка не є вразливою до переповнення.
Джеремі

19

ПРИМІТКА. Ви завжди отримаєте принаймні 1 сторінку, навіть для 0 підрахунків, якщо розмір сторінки> 1, що мені потрібно, але може бути не тим, що вам потрібно. Розмір сторінки 1 (безглуздо, але технічно обгрунтовано) та кількість 0 становитимуть нуль сторінок. Залежно від ваших потреб, ви можете перевірити наявність нульового значення для кількості та розміру сторінки 1

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

Так, простіше. Простіше, але неправильно. якщо кол = 0, то сторінок = 1
Павло Мельников

1
@Pevel Мельников. Я вважаю, що в чисто педантичному розумінні це неправильно, але це залежить від контексту. У коді, який я використовував, я завжди хотів щонайменше 1 сторінку (0 сторінок було недійсно, навіть якщо було 0 елементів). Я повинен хоча б додати примітку.
Booji Boy

1
@PavelMelnikov, це не зовсім неправильно. Це просто залежить від того, як ви хочете на це подивитися. Однак припущення, що воно завжди повертає принаймні 1 сторінку, є неправильним. 0 записів і розмір сторінки 1 приведе до 0. Тож просто не дозволяйте розмір сторінки 0 або виконайте перевірку.
Майкл

12

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;

1
  1. Ви можете отримати загальну сторінку на сервері Sql: -
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);


1

У мене працювали:

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

0

Щось, що я написав сам:

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)


0

Нижче наведено робочий код для обчислення пагінації у списку:

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

Елементи списку = new List (); Завдання: Додайте елементи до списку:

              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);
              }

-1

Щоб уникнути помилок з нумерацією сторінок, найкращий спосіб обчислення noOfPages - це зробити наступний рядок

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

Це не повинно дати вам сторінку 2, коли PageSize == imagesFound.Length


1
Я не вважаю це дійсним. Якщо у вас довжина 3 і розмір сторінки 2, ви очікуєте 2 сторінки (перша сторінка має 2 елементи, друга сторінка має 1). Це дасть вам (3-1) / 2 = 1 сторінку.
joshhendo

Змінив оригінальний пост, щоб вмістити це, дякую, що помітили
Клейтон С
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.