Передача переменной объекта из списка в ошибку цикла по каждому элементу

Я новичок в SSIS и сталкиваюсь с интересной проблемой. Я передаю список в переменную объекта и передаю контейнеру foreach этот объект, поскольку он содержит несколько путей к файлам. Это мой код C#:

 FileInfo[] excelFiles = di.GetFiles("*.xlsx");
        ExcelModel model = new ExcelModel();
        if (excelFiles.Length > 0)
        {
            foreach(var item in excelFiles)
            {
                //recent edit
                model = new ExcelModel();
                model.ExcelFilePath = item.FullName;
                list.Add(model);
            }

        }
        Dts.Variables["ExcelFilesList"].Value = list;

ExcelModel это...

class ExcelModel
    {
        public string ExcelFilePath { get; set; }
    }

Я получаю следующую ошибку: Ошибка: Невозможно применить сопоставление переменной ForEach номер 1 с переменной "User::ExcelFilePath".

Любая помощь была бы фантастической, я застрял на некоторое время.

РЕДАКТИРОВАТЬ: В Foreach в сопоставлении переменных у меня есть строка ExcelFilePath, которая сопоставлена ​​с индексом 0

3 ответа

Вы просто редактируете тот же объект и добавляете его в список. Вы должны создавать новый объект каждый раз.

FileInfo[] excelFiles = di.GetFiles("*.xlsx");
        ExcelModel model = new ExcelModel();
        if (excelFiles.Length > 0)
        {
            foreach(var item in excelFiles)
            {
                model = new ExcelModel();
                model.ExcelFilePath = item.FullName;
                list.Add(model);
            }

        }
        Dts.Variables["ExcelFilesList"].Value = list;

Или же:

FileInfo[] excelFiles = di.GetFiles("*.xlsx");
        if (excelFiles.Length > 0)
        {
            foreach(var item in excelFiles)
                list.Add(new ExcelModel(){ExcelFilePath = item.FullName});
        }
        Dts.Variables["ExcelFilesList"].Value = list;

Или же:

FileInfo[] excelFiles = di.GetFiles("*.xlsx");
            if (excelFiles.Length > 0)
                    list.AddRange(excelFiles.Select(e=> item ExcelModel{ExcelFilePath = item.FullName}));
            Dts.Variables["ExcelFilesList"].Value = list;

Проблема связана с расположением переменной, вместо этого вы должны действительно использовать Linq - это значительно упрощает это для вас. Судя по ответу на свой вопрос, кажется, что вам действительно нужно List<string>, здесь Linq для этого.

 FileInfo[] excelFiles = di.GetFiles("*.xlsx");
 if (excelFiles.Length > 0)
 {
     Dts.Variables["ExcelFilesList"].Value =
         excelFiles.Select(file => file.FullName).ToList();
 }

После недолгого размышления я понял проблему... Я изменил свой код так:

        List<string> newList = new List<string>();
        FileInfo[] excelFiles = di.GetFiles("*.xlsx");
        if (excelFiles.Length > 0)
        {
            foreach (var item in excelFiles)
            {
                newList.Add(item.FullName);
            }
        }
        Dts.Variables["ExcelFilesList"].Value = newList;
Другие вопросы по тегам