【问题标题】:Compare multiple lists to contain the same data比较多个列表以包含相同的数据
【发布时间】:2017-01-29 04:50:25
【问题描述】:

我有一个具有List<FileInfo> 类型属性的机器列表。这是定义。

internal class Machine
{
    internal string MachineName { get; set; }
    internal List<FileInfo> Files { get; set; }

    internal Machine(string machine)
    {
        this.MachineName = machine;
        this.Files = new List<FileInfo>();
    }

    public override string ToString()
    {
        return string.Format("Machine - {0}", this.MachineName);
    }
}

代码从我的网络上的服务器填充列表,每个服务器应该有相同版本的相同文件,如果没有,我需要了解它们。

如何使用 C# 务实地比较多个 Files 列表(如果重要的话,一次最多四个)?

如果只有两台机器可供比较(例如使用Distinct),这将很容易,而且我确实可以将所有列表与一个进行比较。但是有什么方法可以同时比较所有的吗?

【问题讨论】:

  • 这个问题有点难以回答,因为它并不完全清楚你想要做什么。然而;如果你想比较任何你可以使用 linq 的列表,但你需要一些东西来比较它。您在比较中究竟在寻找什么?您能否发送一行显示比较逻辑的快速代码,我相信我可以从那里为您提供用于比较列表的逻辑。

标签: c# compare fileinfo


【解决方案1】:

你应该看看Enumerable.GroupBy

您需要做的就是展平文件列表 (SelectMany),按 FileInfo 分组并断言所有组都有 n 文件,n 是您正在验证的机器数量:

var areAllIdentical = machines.SelectMany(m => m.Files)
                              .GroupBy(f => f, myComparer)
                              .All(g => g.Count() == n);

myComparer 存在是因为您可能需要在分组时为FileInfo 实现自己的相等逻辑;默认行为很可能无法满足您的要求,现在无法检查,但我猜是它的引用相等。

是什么让两个FileInfo 被认为是相同的?相同的文件名、上次写入日期等?在自定义 IEqualityComparer&lt;FileInfo&gt; 中实现该逻辑即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-29
    • 2020-01-18
    • 1970-01-01
    • 2017-01-03
    • 2012-01-06
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多