2009-05-13 3 views
1

У меня есть хеш-таблица с n количеством записей. Мне нужно скопировать записи между x и y и повторить их.копия n k/v пар из Hashtable

Как мне это сделать?

Пример:

HT1.Count = 500;

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

--edit--

Просто так вы знаете, рассуждения для этого я генерации PDF от .MSG файлов. Проблема возникает у конечного пользователя, когда при получении PDF-файла объемом 12 ГБ возникают проблемы: P

Мне нужно разбить PDF-сообщения на сообщения 250 и начать новый PDF-файл. Таким образом, порядок не имеет особого значения, и он не возвращает одинаковые записи каждый раз, так как это будет сделано только один раз.

ответ

2

Моей ставка будет делать пользовательскую функцию, как это:

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

Однако, примите во внимание, что порядок ключей не гарантируется, так что это может иметь неупорядоченную последовательность объектов

+1

Зачем использовать пользовательскую функцию на хеш-таблице? Почему бы просто не перечислить с помощью foreach в GetEnumerator, а затем добавить n значений в HT2. – DevinB

+0

не нужно использовать доходность или что-то интересное для этого. – DevinB

+0

Вы можете сделать любое из этого, но таблицы хэша действительно неупорядочены. Он может не надежно давать вам те же N элементов каждый раз, и если это произойдет, он может не дать вам то же самое год через год. – mquander

0

Предлагаю вам ознакомиться со ссылкой на хеш-таблицы. Хэш-таблицы обычно неупорядочены, поэтому ваш вопрос бессмыслен.

+0

Его вопрос сводится к предложению SELECT TOP (x) от SQL. Вы просите выборку данных, а не обязательно случайных или упорядоченных, только образец данных. – DevinB

+0

ОК, я исправляю свое замечание: вы можете выбрать N в случайном порядке. Однако, как он сформулировал вопрос («скопировать записи между x и y»), казалось, подразумевает, что он ищет какой-то определенный детерминированный поднабор своих данных. – mquander

1

Как утверждали другие, вы не можете перебирать хэш-таблицу так, как вам кажется. Если же, с другой стороны, то, что вы хотите, это результат, где ключи находятся в этом диапазоне, вы можете сделать что-то вроде этого:

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

Заметьте, что я использую дженерик (Dictionary) вместо старого Hashtable, но идея была бы такой же.

Смежные вопросы