我有一个属性类型为 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
),这将很容易,事实上我可以将所有列表与一台进行比较。但是有没有办法同时比较所有内容?
看看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>
中实现该逻辑,即可设置。