none
Как скопировать часть колекции Hashtable в другую коллекцию? RRS feed

  • Вопрос

  • Сначала создал такую коллекцию:

    Hashtable ConvertByteToBool(byte[] random)
            {
                //Преобразовываем массив байт в массив Bool
                BitArray arrBool = new BitArray(random);
                //Преобразование 1D массива Bool в массив массивов 3D массивов Bool
                int xyzMax = (int)Math.Round(Math.Pow(kMax * kMax, 1.0 / 3.0), 0); //размер полубайта 4 )))
                int cub = (int)Math.Pow(xyzMax, 3.0); //размер кубика
                int xyz = 0;
                int BoolMax = arrBool.Length / cub;
                bool[, ,] arrBool_3D = null;// = new bool[xyzMax, xyzMax, xyzMax];
                Hashtable collections = new Hashtable();
                for (int i = 0; i < BoolMax; i++)
                {
                    arrBool_3D = new bool[xyzMax, xyzMax, xyzMax];
                    for (int z = 0; z < xyzMax; z++)
                    {
                        for (int y = 0; y < xyzMax; y++)
                        {
                            for (int x = 0; x < xyzMax; x++)
                            {
                                arrBool_3D[z, y, x] = arrBool[xyz++];
                            }
                        }
                    }
                    collections.Add(i, arrBool_3D);
                }
                return collections;
            }

    Но, потом мне нужно в цикле использовать «блоками» эту коллекцию.
    Т.е. коллекция имеет ключи 1,2,3,4,…n каждому из которых присвоен свой трехмерный логический массив.
    А нужно в цикле брать коллекцию с ключами 1 и 2, обрабатывать. В следующем цикле брать 3 и 4, обрабатывать.
    Размер «блока» может меняться от 1 до 4.
    Подумал, что это можно сделать, если копировать значения из большой коллекции в новую коллекцию (меньшего размера, т.е. кратную размеру «блока»). И уже малую коллекцию предавать в следующие функции для обработки.
    Малая коллекция должна содержать нужные «блоки» большой коллекции. Т.е. нужное количество пар ключа (int) и его значения (bool[,,]).

    //Преобразовываем массив байт в массив Bool
                //Преобразование 1D массива Bool в коллекцию массивов 3D Bool
                collectionsFile = ConvertByteToBool(arrFileBytes);
    
                //выбираем количество раундов
                int round = comboBox_round.SelectedIndex + 1;
                Hashtable collectionsBlok = new Hashtable();; //коллекция 3D массивов блока
                // средний цикл шифрования (раунды)
                for (int i_round = 0; i_round < round; i_round++)
                {
                    // внутренний цикл
                    for (int i_blok = 0; i_blok < blokMax; i_blok += blokCub)
                    {
                        collectionsBlok.Clear();
                        // ???
                    }
                }

    Подскажите, пожалуйста, как скопировать часть больной коллекции в малую коллекцию?
    10 февраля 2012 г. 9:56

Ответы

  • Во-первых, избавтесь от Hashtable, она вам здесь совершенно не нужна. Вместо нее - обычный List<>.

    А далее , у List<T> можете вызывать методы CopyTo и т.п. Хотя необходимость такого копирования - тоже сомнительна.

    • Помечено в качестве ответа Abolmasov Dmitry 12 февраля 2012 г. 21:49
    10 февраля 2012 г. 12:54
    Отвечающий

Все ответы

  • Сделал пока, вот так:

     // внутренний цикл
                    for (int i_blok = 0; i_blok < blokMax; i_blok += blokCub)
                    {
                        collectionsBlok.Clear();
                        for (int i_cub = 0; i_cub < blokCub; i_cub++)
                        {
                            collectionsBlok[i_cub] = collectionsFile[i_cub + i_blok];
                        }
                        //дальнейшая обработка
                    }

    А есть возможность без цикла For  это сделать?

    10 февраля 2012 г. 10:25
  • Во-первых, избавтесь от Hashtable, она вам здесь совершенно не нужна. Вместо нее - обычный List<>.

    А далее , у List<T> можете вызывать методы CopyTo и т.п. Хотя необходимость такого копирования - тоже сомнительна.

    • Помечено в качестве ответа Abolmasov Dmitry 12 февраля 2012 г. 21:49
    10 февраля 2012 г. 12:54
    Отвечающий
  • код будет быстрее работать, если так сделать?

    List<bool[, ,]> ConvertByteToBoolList(byte[] random)
            {
                //Преобразовываем массив байт в массив Bool
                BitArray arrBool = new BitArray(random);
                //Преобразование 1D массива Bool в массив массивов 3D массивов Bool
                int xyzMax = (int)Math.Round(Math.Pow(kMax * kMax, 1.0 / 3.0), 0); //размер полубайта 4 )))
                int cub = (int)Math.Pow(xyzMax, 3.0); //размер кубика
                int xyz = 0;
                int BoolMax = arrBool.Length / cub;
                bool[, ,] arrBool_3D = null;// = new bool[xyzMax, xyzMax, xyzMax];
                List<bool[, ,]> Listes = new List<bool[, ,]>();
                for (int i = 0; i < BoolMax; i++)
                {
                    arrBool_3D = new bool[xyzMax, xyzMax, xyzMax];
                    for (int z = 0; z < xyzMax; z++)
                    {
                        for (int y = 0; y < xyzMax; y++)
                        {
                            for (int x = 0; x < xyzMax; x++)
                            {
                                arrBool_3D[z, y, x] = arrBool[xyz++];
                            }
                        }
                    }
                    Listes.Add(arrBool_3D);
                }
                return Listes;
            }

    10 февраля 2012 г. 13:07
  • Да, быстрее.

    10 февраля 2012 г. 18:38
    Отвечающий
  • sg6336, не забывайте отмечать ответ, решающий проблему.

    Спасибо.


    Для связи [mail]

    12 февраля 2012 г. 21:48