0

我有两个IEnumerable<FileInfo>要比较的列表:

IEnumerable<FileInfo> list1 = dir1.GetFiles("*" + _ext1, SearchOption.AllDirectories);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*" + _ext2, SearchOption.AllDirectories);

其中 _ext1 和 _ext2 是不同的文件扩展名类型。例如:

string _ext1 = ".jpg";
string _ext2 = ".png";

所以list1看起来像:

file1.jpg
file2.jpg
file3.jpg
file4.jpg
file5.jpg
file6.jpg

看起来list2像:

file1.png
file2.png
file4.png

我想在 list2 中找到 list1 中不存在的所有内容。我尝试了以下方法:

List<string> list1FileNames = list1.Select(f => Path.GetFileNameWithoutExtension(f.FullName)).ToList();
List<string> list2FileNames = list2.Select(f => Path.GetFileNameWithoutExtension(f.FullName)).ToList();
var setDiff = list1FileNames .Except(list2FileNames );

这很好,工作正常并返回(注意没有文件扩展名):

file3
file5
file6    

但是,我真正想要的是获取 FileInfo 的列表,而不仅仅是 FileName 字符串。我需要这个,因为我需要其他信息,例如 FullFile 路径,ext.. 所以只是文件名字符串列表无法完成这项工作。我该怎么做呢?

4

3 回答 3

1

如果你正在寻找速度,试试这个:

private IEnumerable<FileInfo> GetUniqueFilesWithoutExtension(IEnumerable<FileInfo> list1, IEnumerable<FileInfo> list2)
{
    var d = new HashSet<string>();
    foreach (var fi in list2)
    {
        d.Add(Path.GetFileNameWithoutExtension(fi.FullName));
    }

    foreach (var fi in list1)
    {
        if (!d.Contains(Path.GetFileNameWithoutExtension(fi.FullName)))
        {
            yield return fi;
        }
    }
}

从 中创建一个文件名(无扩展名)的哈希集list2,然后遍历list1并仅返回文件名(无扩展名)未出现在来自list2. 允许您在以流式方式发现结果时使用您的yield return结果,而不必等待整个列表生成,如果这对您很重要的话。

于 2016-08-10T22:15:23.187 回答
1

怎么样:

IEnumerable<FileInfo> list1 = dir1.GetFiles("*" + _ext1, SearchOption.AllDirectories);
IEnumerable<FileInfo> list2 = dir2.GetFiles("*" + _ext2, SearchOption.AllDirectories);

IEnumerable<FileInfo> filtered = list2.Where(f2 => !list1.Any(f1 =>
    Path.GetFileNameWithoutExtension(f1.FullName) == Path.GetFileNameWithoutExtension(f2.FullName)));
于 2016-08-10T21:10:27.050 回答
0

您可以使用Where()with All(),但它的时间复杂度很高:

var difference =  list2
                  .Where(f=>list1.All(x=>Path.GetFileNameWithoutExtension(x.FullName) != Path.GetFileNameWithoutExtension(f.FullName)); 
于 2016-08-10T21:08:40.517 回答