【问题标题】:Combine two (or more) FileInfo lists...合并两个(或更多) FileInfo 列表...
【发布时间】:2010-09-27 20:14:57
【问题描述】:

我有类似的东西:

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

【问题讨论】:

  • 由于 GetFiles 返回一个 FileInfo 实例数组,我认为详细说明如何组合两个数组的示例将是您所需要的。 “似乎没有任何效果”是不够的信息。给我们一个例子和你得到的错误信息。这对于 Linq 来说是微不足道的:var joined = f1.Union(f2);(编辑:当我打算做 Union 时加入了,抱歉)
  • 我尝试了一些不同的方法。不确定到底要放在那里,所以我确实在细节上有点稀疏,但两个答案(到目前为止)似乎都是正确的。

标签: c# fileinfo directoryinfo


【解决方案1】:

嗯,Concat 肯定可以工作:

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

如果您需要数组或列表,请适当调用ToArrayToList

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

顺便说一句,您的逐字字符串文字不需要逐字 - 它不包含任何需要转义的内容。

【讨论】:

  • 我想我之前一定有过类型或其他东西......我以为我试过了,但现在它似乎工作了。
  • 关于逐字字符串...我最初是通过字符串数学(source + @"\subfolder")完成的,但偶然发现了更优雅的 Path.Combine :)
【解决方案2】:

你需要创建一个List&lt;FileInfo&gt;,像这样:

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

如果你有DirectoryInfos的集合,可以拨打SelectMany

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

【讨论】:

  • 值得深思的好想法。仍在尝试围绕 LINQ。我喜欢 SelectMany。
【解决方案3】:

我的解决方案:

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;
    }

【讨论】:

  • 已经有一个完美的答案,可以解决 OP 的问题。您的答案完全错误且多余。此外,您根本不解释自己,请看how to write a good answer
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2022-12-15
  • 2016-10-14
  • 1970-01-01
相关资源
最近更新 更多