比较多个列表以包含相同的数据

时间:2017-01-29 04:50:26

标签: c# compare fileinfo

我有一个具有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),这将很容易,事实上我可以将所有列表与一个列表进行比较。但有没有办法同时比较所有?

1 个答案:

答案 0 :(得分: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<FileInfo>中实现该逻辑,然后进行设置。