【问题标题】:C# Comparing two lists (FileData)C# 比较两个列表(FileData)
【发布时间】:2017-05-30 08:04:21
【问题描述】:

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

        }
    }

【问题讨论】:

  • 旧列表永远不会包含您正在内联创建的对象,您可能想要检查属性而不是整个对象
  • 您如何在旧列表中存储“旧”信息?它是一个平面列表还是包含嵌套文件?
  • @goaty 我通过读取 xml 文件来存储它。 lstNew 将在应用程序执行时覆盖 xml。
  • 我认为您需要存储这些旧数据。这样您就可以比较新旧数据。

标签: c# fileinfo directoryinfo


【解决方案1】:

假设您的 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()

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 2021-02-19
      • 1970-01-01
      相关资源
      最近更新 更多