C#比较两个列表(FileData)

时间:2017-05-30 08:04:22

标签: c# fileinfo directoryinfo

我正在创建一个正在浏览文件夹结构的程序。如果有什么变化,我想把它写成一个列表。我的问题是,在比较两个列表时,我不知道如何保存lstChanges中的更改。 if语句的语法是什么?这就是我现在所得到的:

public static void GoThroughFileSystem(DirectoryInfo x)
    {
        foreach (DirectoryInfo d in x.GetDirectories())
        {
            //Console.WriteLine("Folder: {0}", d.Name);
            GoThroughFileSystem(d);
        }

        foreach (FileInfo f in x.GetFiles())
        {
            lstNew.Add(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime });
            if (!lstOld.Contains(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime }))
            {
                lstChanges.Add(new FileData { path = f.FullName, ChangingDate = f.LastWriteTime });
            }

        }
    }

2 个答案:

答案 0 :(得分:0)

假设您List<FileInfo>中的最后一次迭代中有lstOld个文件,您可以将if语句更新为

//using System.Linq;

if (!lstOld.Any(old => old.Path == f.FullName && old.ChangingDate == f.LastWriteTime))

List<>.Contains使用默认质量比较器。因此,创建new FileInfo将无效,除非FileInfo正确实施IEquatable<T>.Equals()

答案 1 :(得分:0)

您还可以尝试旧时尚左外连接:)

var lParent = x.GetFiles();
var lChild = lstOld;

var differences = lParent.GroupJoin(
    lChild,
    p => p.FullName,
    c => c.LastWriteTime,
    (p, g) => g
        .Select(c => new { FullName = p.FullName, LastWriteTime = c.LastWriteTime})
        .DefaultIfEmpty(new { FullName = p.FullName, LastWriteTime = null}))
    .SelectMany(g => g);

如果您的目标是从两个集合中收集所有唯一值,那么您需要的东西称为完全外部联接。对于两个相同类型的集合,您可以使用union并删除公共部分:

lParent.Union(lChild).Except(lParent.Intersect(lChild));