2017-05-30 106 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));