2009-10-23 7 views
51

J'ai un tableau et je veux les diviser en page en fonction de la taille de la page préréglée.La formule la plus simple pour calculer le nombre de pages?

Voici comment je fais:

private int CalcPagesCount() { 

     int totalPage = imagesFound.Length/PageSize; 

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

     return totalPage; 
    } 

je me sens le calcul est pas le plus simple (je suis pauvre en mathématiques), pouvez-vous donner une formule de calcul plus simple?

Répondre

125

force à arrondir:

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

Ou utiliser les mathématiques à virgule flottante:

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

Danger ... il en résulte un débordement lorsque 'PageSize = int.MaxValue'. J'ai ajouté une réponse qui n'est pas vulnérable à un débordement. – Jeremy

19

En fait, vous êtes à proximité des meilleurs que vous pouvez faire. La seule chose que je peux penser à qui pourrait être « meilleur » est quelque chose comme ceci:

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

Et la seule raison que cela est mieux est que vous évitez l'instruction if.

+0

Danger ... il en résulte un débordement lorsque 'PageSize = int.MaxValue'. J'ai ajouté une réponse qui n'est pas vulnérable à un débordement. – Jeremy

-1

Pour éviter d'avoir des erreurs avec la numérotation des pages de la meilleure façon que je peux penser à calculer noOfPages est en faisant la ligne suivante

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

Cela ne devrait pas vous la page 2 lorsque PageSize == imagesFound.Length

+1

Je ne pense pas que ce soit valide. Si vous avez une longueur de 3 et une taille de page de 2, vous attendez 2 pages (la première page a 2 éléments, la deuxième page en a 1). Cela vous donnera (3-1)/2 = 1 page. – joshhendo

+0

modifié le poste original pour accueillir pour cela aussi, merci de remarquer –

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

Cela semble beaucoup plus simple que la réponse acceptée. –

+0

Oui, plus simple. Plus simple mais faux. si compte = 0 alors pages = 1 –

+0

@Pevel Melnikov. Je suppose que dans un sens purement pédant c'est faux, mais cela dépend du contexte. Dans le code que j'ai utilisé ceci dans j'ai toujours voulu au moins 1 page (0 pages était invalide même s'il y avait 0 articles). Je devrais au moins ajouter une note. –

3

L'OP contient une réponse valide. Si je voulais désactiver pagination puis je pourrais définir PageSize = int.MaxValue.

Plusieurs réponses ici ajoutent à PageSize (imagesFound.Length + PageSize) et cela provoquerait un débordement. Ce qui conduit alors à un résultat incorrect.

C'est le code que je vais utiliser:

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; 
Questions connexes