2009-04-23 6 views
0

Je me demandais comment obtenir le nombre d'éléments stockés dans un TBucketList. Pour autant que je peux voir il n'y a que le nombre de seaux et le réseau de seau disponible, donc tout ce que je peux penser estNombre d'éléments stockés dans la liste de compartiments

Count := 0; 
for I := 0 to BucketList.BucketCount - 1 do 
    Inc (Count, BucketList.Buckets [I].Count); 

qui fonctionne, mais il me semble étrange, que je dois itérer tous seaux pour trouver le nombre d'articles stockés - quelque chose qui est probablement nécessaire très souvent.

Ai-je manqué une autre possibilité? Ou existe-t-il une raison pour laquelle cette classe de conteneur ne fournit pas de membre Count comme les autres conteneurs?

Merci!

Répondre

4

Les bibliothèques ne sont jamais complètes. Mais vous pouvez les étendre.

Si vous avez souvent besoin de cette valeur, vous pouvez écrire une aide de classe pour cela.

TBucketListHelper = class helper for TBucketList 
    function GetCount: Integer; 
end; 

function TBucketListHelper.GetCount: Integer; 
var 
    i : Integer; 
begin 
    Result := 0; 
    for I := 0 to BucketCount - 1 do 
    Inc (Result, Buckets [I].Count); 
end; 

Vous pouvez maintenant utiliser:

BucketList.GetCount 

Si TBucketListHelper est dans la portée.

+0

C'est exactement ce que j'ai fait. Je n'utilise pas directement TBucketList mais j'en tire ma propre classe. Je me demandais simplement s'il y avait une autre possibilité ou une raison pour laquelle cela n'a pas été mis en œuvre. Si j'appelle quelque chose comme HashTable.Count je ne m'attends pas à itérer sur peut-être des milliers de seaux ... – jpfollenius

2

Il n'y a pas d'autre solution sans avoir à garder un compteur en phase avec le contenu.
Il s'agit essentiellement d'une collection de collections.

0

Puisque vous utilisez votre propre classe dérivée puis juste augmenter et diminuer un compteur sur Ajouter et Retirer. Vous pouvez inclure la méthode loop comme double vérification au cas où.

Questions connexes