2010-09-27 2 views
1

У меня есть что-то похожее на это:Объединить два (или более) списков FileInfo ...

var d1 = new DirectoryInfo(Path.Combine(source, @"bills_save." + dt)); 
var d2 = new DirectoryInfo(Path.Combine(source, @"reports_save." + dt)); 

var f1 = d1.GetFiles(); 
var f2 = d2.GetFiles(); 

Я хочу получить, и объединить, все имена файлов в один список FileInfo. Сделал бы мой анализ намного проще. Concat, AddRange, присоединяйтесь ... ничего не работает. Большинство из того, что я вижу, это добавление 2 списков, массивов.

+1

, так как GetFiles возвращает массив экземпляров FileInfo, я бы подумал о примерах, описывающих, как расчесывать два массива будут вам нужны. «Ничего не работает» недостаточно информации. Дайте нам пример и сообщение об ошибке, которое вы получите. Это тривиально, скажем, Linq: 'var join = f1.Union (f2);' (edit: did Join, когда я хотел сделать Union, извините) – Will

+0

Я пробовал несколько разных вещей. Не было точно, чтобы туда попасть, поэтому я немного разобрался в деталях, но оба ответа (пока) кажутся пятнами. – WernerCD

ответ

6

Ну, Concat конечно, должно работать:

// f3 will be IEnumerable<FileInfo> 
var f3 = f1.Concat(f2); 

Если вам нужен массив или список, вызовите ToArray или ToList соответствующим образом:

var list3 = f1.Concat(f2).ToList(); 
var array3 = f1.Concat(f2).ToArray(); 

Кстати, ваша дословная строка символов Безразлично» t должен быть дословным - он не содержит ничего, что могло бы ускользнуть.

+0

+1: Concat - это простой вариант, и он тоже очень хорошо читается. – RedFilter

+0

Я думаю, что у меня, должно быть, был какой-то тип или что-то еще ... Я думал, что попробовал это, но теперь, похоже, он работает. – WernerCD

+0

о Verbatim String ... Я сделал это сначала с помощью строковой математики (source + @ "\ subfolder"), но наткнулся на Path.Combine, который намного более изящный :) – WernerCD

3

Вам нужно сделать List<FileInfo>, как это:

List<FileInfo> files = new List<FileInfo>(); 
files.AddRange(d1.GetFiles()); 
files.AddRange(d2.GetFiles()); 

Если у вас есть коллекция DirectoryInfo с, вы можете позвонить SelectMany:

IEnumerable<FileInfo> files = directories.SelectMany(d => d.GetFiles()); 
+0

Хорошие мысли, чтобы обдумать. Все еще пытаюсь обернуть голову вокруг LINQ. Мне нравится SelectMany. – WernerCD

-1

Мое решение:

public static FileInfo[] GetFiles(DirectoryInfo dir, string searchPattern, SearchOption searchOption) 
    { 
     string[] searchPatterns = searchPattern.Split('|'); 
     FileInfo[] fileinfos=null; 
     foreach (string sp in searchPatterns) 
     { 
      FileInfo[] newFiles = dir.GetFiles(sp, searchOption); 
      if (fileinfos == null) 
      { 
       fileinfos = newFiles; 
      } 
      else 
      { 
       if (newFiles.Length > 0) 
       { 
        fileinfos = (FileInfo[])fileinfos.Concat(newFiles).ToArray(); 
       } 
      } 
     } 
     return fileinfos; 
    } 
+0

Существует уже идеальный ответ, который решает проблему OP. Ваш ответ находится в общем неправильном месте и избыточен. Кроме того, вы вообще не объясняете себя, пожалуйста, взгляните на [как написать хороший ответ] (https://stackoverflow.com/help/how-to-answer). –