Задать вопрос
@Tatami4865

Как правильно заполнить списки объектов из другого класса и вытащить из них данные?

В классе ImageCompressor имеется 2 списка, первый заполняется по нажатию кнопки на главной форме, а второй (скрытно от пользователя), внутри класса ImageCompressor, после вызова метода Compress().

Когда пытаюсь вытащить данные из этих списков программа падает (исключение связано с индексом за пределами списка - появляется из-за пустоты второго списка).

В режиме отладки видно, что второй список внутри класса ImageCompressor заполнен элементами, а когда пытаешься получить данные из него через главную форму он пуст, почему?

Class "ImageCompressor"

public class ImageCompressor {
        public readonly string FilePath;
        public readonly string FileName;
        public readonly long FileSize;

        // ОБЬЯВЛЕНИЕ СПИСКОВ
        public List<ImageCompressor> FilesBeforeProcessing { get; set; }
        public List<ImageCompressor> FilesAfterProcessing { get; private set; }

        public ImageCompressor() {
            // ИНИЦИАЛИЗАЦИЯ СПИСКОВ
            FilesBeforeProcessing = new List<ImageCompressor>();
            FilesAfterProcessing = new List<ImageCompressor>();
        }

        public ImageCompressor(string path) {
            FilePath = path;
            FileName = new FileInfo(path).Name;
            FileSize = new FileInfo(path).Length;
        }

        // МЕТОД ЗАПОЛНЯЮЩИЙ ВТОРОЙ СПИСОК ЭЛЕМЕНТАМИ
        public void Fill(string outputpath) {
            int length = FilesBeforeProcessing.Count;

            for (int i = 0; i < length; i++) {
                FilesAfterProcessing.Add(new ImageCompressor(
                    Path.Combine(outputpath, FilesBeforeProcessing[i].FileName)));
            }
        }
    }


Main_Form

private void button6_Click(object sender, EventArgs e) {
            ImageCompressor compressor = new ImageCompressor();

            // ПЕРВЫЙ СПИСОК ЗАПОЛНЯЕТСЯ ЭЛЕМЕНТАМИ
            compressor.FilesBeforeProcessing.AddRange(new List<ImageCompressor> {
                new ImageCompressor(@"C:\Users\MSI\Desktop\Translator\uno.jpg"),
                new ImageCompressor(@"C:\Users\MSI\Desktop\Translator\ч.jpg"),
            });

            // ВТОРОЙ СПИСОК ЗАПОЛНЯЕТСЯ ЭЛЕМЕНТАМИ
            compressor.Fill(@"C:\Users\MSI\Desktop\Translator");

            int length = compressor.FilesBeforeProcessing.Count;

            // ОТОБРАЗИТЬ ПЕРВЫЙ СПИСОК - ЗАПОЛНЕН ЭЛЕМЕНТАМИ
            for (int i = 0; i < length; i++) {
                listBox1.Items.Add($"| Name Before {compressor.FilesBeforeProcessing[i].FileName}");
                listBox1.Items.Add($"| Size Before {compressor.FilesBeforeProcessing[i].FileSize}");
            }

            // ОТОБРАЗИТЬ ВТОРОЙ СПИСОК - ПОЧЕМУ-ТО ПУСТОЙ
            for (int i = 0; i < length; i++) {
                listBox1.Items.Add($"| Name After {compressor.FilesAfterProcessing[i].FileName}");
                listBox1.Items.Add($"| Size After {compressor.FilesAfterProcessing[i].FileSize}");
            }
        }
  • Вопрос задан
  • 215 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@oleg_ods
public ImageCompressor(string path) {
            // Здесь должна быть инициализация списков или вызов конструктора без параметров 
            FilePath = path;
            FileName = new FileInfo(path).Name;
        }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы