2017-05-30 105 views
0

我正在创建一个正在通过文件夹结构的程序。如果有什么改变,我想写入一个列表。我的问题是,当比较两个列表时,我不知道如何将更改保存在lstChanges中。 if语句的语法是什么?这是我得到了现在:C#比较两个列表(FileData)

​​
+0

旧列表永远不会包含你正在创建内嵌的对象,你可能要检查的属性,而不是整个对象 – Marv

+0

你怎么样将“旧”信息存储在旧列表中?它是一个平面列表还是将包含嵌套文件? – 2017-05-30 08:19:47

+0

@goaty即时通过读取一个XML文件存储它。 lstNew将在应用程序执行时覆盖xml。 –

回答

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()

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); 

如果你的目标是从两个集合收集所有唯一值,你需要的东西被称为完整外部联接。对于两个相同类型的集合,你可以使用联盟和删除公共部分:

lParent.Union(lChild).Except(lParent.Intersect(lChild));