Как объединить файлы из разных каталогов в массив строк - PullRequest
0 голосов
/ 04 октября 2019

C # Вопрос новичка, мне нужно собрать файлы из четырех папок на основе фильтра и поместить их все в один массив:

string[] files = Directory.GetFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_1"].Value.ToString());
string[] files = string[] + Directory.GetFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_2"].Value.ToString());
string[] files = string[] + Directory.GetFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_3"].Value.ToString());
string[] files = string[] + Directory.GetFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_4"].Value.ToString());

Каков наилучший способ сделать это с помощью c #, каким-то образом объединитьстрока сначала помещается в массив.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вы можете поместить Linq Concat:

 using System.Linq;

 ...

 string[] files = Directory.EnumerateFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_1"].Value.ToString())
   .Concat(Directory.EnumerateFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_2"].Value.ToString()))
   .Concat(Directory.EnumerateFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_3"].Value.ToString()))
   .Concat(Directory.EnumerateFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_4"].Value.ToString())) 
   .ToArray();

Если у вас есть коллекции folders и filters, и вы хотите получить файлы в все folders с all filters, вы можете использовать Cartesian Join (который может быть реализован с помощью SelectMany):

  using System.Linq;

  ... 

  // I've put arrays here, but any collection 
  // which implements IEnumerable<string> will do
  string[] folders = ...
  string[] filters = ...

  string[] files = folders
    .SelectMany(folder => filters
       .SelectMany((filter) => Directory.EnumerateFiles(folder, filter))) 
    .ToArray();
0 голосов
/ 04 октября 2019

Если фильтр, который вы упомянули, является фиксированным, и он в том же самом, только конечный номер отличается, я лично сделал бы это, используя цикл for.

const int noOfFilters = 4;
string[] files = Directory.GetFiles(DirPath,Dts.Variables["User::vCSV_Folder_File_Filter_1"].Value.ToString());
for(int i = 2; i <= noOfFilters  /*using the variables helps minimal change*/;i++)
{
    files = files  + Directory.GetFiles(DirPath, Dts.Variables["User::vCSV_Folder_File_Filter_" + i.ToString()].Value.ToString());
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...