C# 比较两个列表 (FileData)

C# Comparing two lists (FileData)

我正在创建一个通过文件夹结构的程序。如果有什么变化,我想把它写到一个列表中。我的问题是,在比较两个列表时,我不知道如何保存 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 });
            }

        }
    }

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

//using System.Linq;

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

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

你也可以尝试老式的左外连接:)

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