2009-10-23 21 views
51

Tengo una matriz y quiero dividirlas en páginas según el tamaño de página preestablecido.¿La fórmula más simple para calcular el recuento de páginas?

Esto es como lo hago:

private int CalcPagesCount() { 

     int totalPage = imagesFound.Length/PageSize; 

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

     return totalPage; 
    } 

me siento el cálculo no es el más simple (soy pobre en matemáticas), se puede dar una simple fórmula de cálculo?

Respuesta

125

obligarlo a redondear al alza:

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

O utilice punto flotante de matemáticas:

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

Peligro ... esto da lugar a un desbordamiento cuando 'PageSize = int.MaxValue'. Agregué una respuesta que no es vulnerable a un desbordamiento. – Jeremy

19

realidad, que está cerca de lo mejor que puede hacer. Sobre la única cosa que se me ocurre que podría ser "mejor" es algo como esto:

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

Y la única razón por la que esto es mejor es que permite evitar la sentencia if.

+0

Peligro ... esto da como resultado un desbordamiento cuando 'PageSize = int.MaxValue'. Agregué una respuesta que no es vulnerable a un desbordamiento. – Jeremy

-1

para no tener errores con la numeración de páginas de la mejor manera que puedo pensar en el cálculo de noOfPages es haciendo la siguiente línea

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

Esto no debería darle la página 2 cuando PageSize == imagesFound.Length

+1

No creo que esto sea válido. Si tiene una longitud de 3 y un tamaño de página de 2, esperaría 2 páginas (la primera página tiene 2 elementos, la segunda página tiene 1). Hacer esto le dará (3-1)/2 = 1 página. – joshhendo

+0

Alterado la publicación original para acomodar también, gracias por notar –

12
//note: you will always get at least 1 page, even for 0 count, which is what I needed but may not be what you need. 
int pages = ((count - 1)/PAGESIZE) + 1; 
+0

Esto parece mucho más simple que la respuesta aceptada. –

+0

Sí, más simple. Más simple pero equivocado. si count = 0 then pages = 1 –

+0

@Pevel Melnikov. Supongo que en un sentido puramente pedante es incorrecto, pero depende del contexto. En el código que usé en esto, siempre quise al menos 1 página (0 páginas no eran válidas incluso si había 0 elementos). Al menos debería agregar una nota. –

3

El OP contiene una respuesta válida. Si quisiera apague paginación entonces podría configurar PageSize = int.MaxValue.

Varias respuestas aquí se suman a PageSize (imagesFound.Length + PageSize) y eso causaría un desbordamiento. Que luego conduce a un resultado incorrecto.

Este es el código que voy a utilizar:

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; 
Cuestiones relacionadas