合并两个(或更多)FileInfo列表......

时间:2010-09-27 20:14:58

标签: c# fileinfo directoryinfo

我有类似的东西:

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个列表,数组。

3 个答案:

答案 0 :(得分:7)

嗯,Concat当然应该有效:

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

如果您需要数组或列表,请相应地致电ToArrayToList

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

顺便说一下,你的逐字字符串文字不需要是逐字的 - 它不包含任何需要转义的字符串。

答案 1 :(得分: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());

答案 2 :(得分:-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;
    }