2009-05-13 5 views
1

J'ai une table de hachage avec n nombre d'enregistrements. Je dois copier les enregistrements entre x et y et les parcourir.copie n paires k/v de Hashtable

Comment est-ce que je ferais ceci?

Exemple:

HT1.Count = 500;

HT2 = HT1 [0] - HT1 [100];

--edit--

Juste pour que vous le savez, le raisonnement est pour ce que je suis générer des PDF à partir de fichiers .MSG. Le problème se pose pour l'utilisateur final qui quand il obtient un PDF 12GB il pose des problèmes: P

Je dois décomposer les PDF en messages de 250, puis lancer un nouveau PDF. Donc, l'ordre n'a pas vraiment d'importance, pas plus que le fait de retourner les mêmes enregistrements à chaque fois, car cela ne sera fait qu'une seule fois.

Répondre

2

Mon pari serait faire une fonction personnalisée comme ceci:

public IEnumerable<object> GetRange(Hashtable ht, int min, int max) { 
    int i = 0; 
    foreach (var key in ht.Keys) { 
     i++; 
     if (i > max) { 
      yield break; 
     } 
     if (i >= min) { 
      yield return ht[key]; 
     } else continue; 
    } 
} 

Cependant, il faut tenir compte du fait que l'ordre des clés est pas garantie, donc cela peut avoir une séquence non ordonnée d'objets

+1

Pourquoi implémenter une fonction personnalisée sur la hashtable? Pourquoi ne pas simplement énumérer en utilisant un foreach sur le GetEnumerator, puis ajouter n valeurs au HT2. – DevinB

+0

pas besoin d'utiliser le rendement ou quelque chose de fantaisie pour celui-ci. – DevinB

+0

Vous pouvez faire tout cela, mais les tables de hachage sont vraiment non ordonnées. Il se peut qu'il ne vous donne pas toujours les mêmes éléments N à chaque fois, et si c'est le cas, il ne vous donnera peut-être pas les mêmes éléments dans un an. – mquander

0

Je vous suggère de consulter une référence sur les tables de hachage. Les tables de hachage sont généralement non ordonnées, donc votre question n'a pas de sens.

+0

Sa question équivaut à la clause SELECT TOP (x) de SQL. Vous demandez un échantillonnage des données, pas nécessairement aléatoire ou ordonné, juste des données d'échantillon. – DevinB

+0

OK, je modifie ma remarque: vous pouvez sélectionner N au hasard. Cependant, la façon dont il a formulé la question («copier les enregistrements entre x et y») semblait impliquer qu'il cherchait un sous-ensemble déterministe particulier de ses données. – mquander

1

Comme d'autres l'ont dit, vous ne pouvez pas itérer sur une table de hachage comme vous le souhaitez. Si, d'autre part, ce que vous voulez est le résultat lorsque les touches sont dans cette gamme, vous pouvez faire quelque chose comme ceci:

public IDictionary<int, T> GetRange<T>(
     IDictionary<int, T> source, int min, int max) 
    { 
     // add error checking for min,max, null, etc... 
     int capacity = Math.Max(0, max - min); 
     Dictionary<int, T> target = new Dictionary<int, T>(capacity); 
     for (int key = min; key < max; key++) 
     { 
      if (source.ContainsKey(key)) 
      { 
       target.Add(key, source[key]); 
      } 
     } 
     return target; 
    } 

Notez que j'utilise la version générique (Dictionary) au lieu de l'ancien Hashtable, mais l'idée serait la même.