我正在创建一个正在浏览文件夹结构的程序。如果有什么变化,我想把它写成一个列表。我的问题是,在比较两个列表时,我不知道如何保存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 });
}
}
}
答案 0 :(得分:0)
假设您List<FileInfo>
中的最后一次迭代中有lstOld
个文件,您可以将if语句更新为
//using System.Linq;
if (!lstOld.Any(old => old.Path == f.FullName && old.ChangingDate == f.LastWriteTime))
List<>.Contains
使用默认质量比较器。因此,创建new FileInfo
将无效,除非FileInfo
正确实施IEquatable<T>.Equals()
。
答案 1 :(得分:0)
您还可以尝试旧时尚左外连接:)
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));