我有一个具有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
),这将很容易,事实上我可以将所有列表与一个列表进行比较。但有没有办法同时比较所有?
答案 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>
中实现该逻辑,然后进行设置。