Как в методе с возвращаемым значением выйти из цикла правильно

233
19 сентября 2018, 12:20

Всех приветствую, вот сделал метод, он читает файл по частям, на вход метода подаем поток, возвращает метод переменную количества блоков, и также возвращает структуру KeyValuePair Не могу сообразить, как выйти правильно из метода с помощью return. Заранее всем спасибо.

        public static KeyValuePair<int, byte[]> Read_Blok(Stream stream,out int count_blok)
    {

       int size = 1024 * 1024;
       int count_part = (int) (stream.Length /size );// количество частей
       int sizeLastPart = count_part - 1; // размер последней части
       byte[] buffer = new byte[size]; // размер буффера
       count_blok = 0;
       int count;
        for (int i = 0; i < count_part; i++)
        {
            if (i == count_part - 1) // когда достигаем последней части, последняя часть блока может быть меньше чем заданный буфер
            {
                buffer = new byte[sizeLastPart];
                count=stream.Read(buffer, 0, buffer.Length);
                count_blok = count_blok + 1;
                return new KeyValuePair<int, byte[]>(count_blok,buffer);
            }
            else
            {
                count = stream.Read(buffer, 0, buffer.Length);
                count_blok = count_blok + 1;
                return new KeyValuePair<int, byte[]>(count_blok,buffer);
                stream.Position = i * buffer.Length;// сдвигаем позицию в потоке

            }

        }

    }
Answer 1
public static IEnumerable<KeyValuePair<int, byte[]>> Read_Block(Stream stream)
{
  const int SIZE_BLOCK = 1024 * 1024; // one megabyte
  int index = 0;
  while (stream.Position < stream.Length)
  {
    byte[] buffer = new byte[System.Math.Min(SIZE_BLOCK, stream.Length - stream.Position)];
    stream.Read(buffer, 0, buffer.Length);
    yield return new KeyValuePair<int, byte[]>(index++, buffer);
  }
}
public static void Test()
{
  using (FileStream fStream = new FileStream("file name", FileMode.Open))
  {
    foreach (KeyValuePair<int, byte[]> block in Read_Block(fStream))
    {
      // process block.Value
    }
  }
}

Строчка

... = new byte[System.Math.Min(SIZE_BLOCK, stream.Length - stream.Position)];

выделяет память под массив в один мегабайт или, если до конца потока осталось меньше, в столько байт, сколько осталось до конца потока.

Answer 2

Не знаю что не так с вычислением count_part но вот так код не должен изменить свою актуальность и функционал, а @Igor правит ответ с новым вычислением переменной.

public static KeyValuePair<int, byte[]> Read_Blok(Stream stream, out int count_blok)
    {
        int size = 1024 * 1024;
        int count_part = (int)(stream.Length / size);// количество частей
        int sizeLastPart = count_part - 1; // размер последней части
        byte[] buffer = new byte[size]; // размер буффера
        count_blok = 0;
        int count;
        for (int i = 0; i < count_part; i++)
        {
            if (i == count_part - 1) // когда достигаем последней части, последняя часть блока может быть меньше чем заданный буфер
            {
                buffer = new byte[sizeLastPart];
                count = stream.Read (buffer, 0, buffer.Length);
                count_blok = count_blok + 1;
            }
            else
            {
                count = stream.Read (buffer, 0, buffer.Length);
                count_blok = count_blok + 1;
                stream.Position = i * buffer.Length;// сдвигаем позицию в потоке
            }
        }
        return new KeyValuePair<int, byte[]> (count_blok, buffer);
    }
READ ALSO
Большое расстояние между значениями Console.Writeline

Большое расстояние между значениями Console.Writeline

При обучении работы с базой данных MS SQL Server, при попытке вывести данные со столбцов ID, Name, Points таблицы users, программа по какой-то причине выдает...

172
Не добавляются элементы в List

Не добавляются элементы в List

Пишу небольшую программу и возникла проблема в том ,что элемент не добавляется в ListСуть в том, что массив должен дублироваться указанное...

163
Чтение больших файлов без нагрузки на память c#

Чтение больших файлов без нагрузки на память c#

Есть большой текстовой файл (несколько гигов), нужно рассмотреть каждую строку не тратя много памяти

183
pyinstaller failed to execute script

pyinstaller failed to execute script

Расклад такой, у меня есть программа на c# она подгружает нужные файлы для работы другой программы на pythonТакие параметры pyinstaller -F --noconsole, программа...

152