2011-11-02 60 views
1

我有兩個文件列表,一個來自本地驅動器,一個來自遠程驅動器。這些文件排列在相同的相對路徑位置,我想將這兩個列表組合成只包含兩個列表中具有相同相對路徑的文件。我還想確保結果列表中沒有重複項,但相對路徑中具有較大時間戳的文件被選中到最終列表中。Linq通過相對文件路徑選擇最新文件

我的列表被稱爲localDetails和remoteDetails,屬於SyncFile類型,並且具有成員RelativeFilePath和ModifyDate。

我已經嘗試使用與僅查看相對文件路徑的自定義相等比較器相交,但無法弄清楚如何從碰撞中選擇最大時間戳。我也嘗試過使用Concat,然後嘗試使用GroupBy,但無法使用它。

+2

發佈您試圖執行的代碼。也許我們可以指出你的錯誤,而不是給你解決方案_as is_。你不應該遠離解決方案。 – Otiel

回答

2

如何:

var results = localDetails.Join(remoteDetails, 
    lf => lf.RelativeFilePath, 
    rf => rf.RelativeFilePath, 
    (lf, rf) => lf.ModifyDate > rf.ModifyDate ? lf : rf); 

這符根據每個列表(因此這兩個鍵選擇器)的相對文件路徑上的兩個列表,然後兩人的「結果」,它採用一個具有更大的ModifyDate。

剛剛測試這對一些樣本數據(根據您的描述)和它的作品,例如,如果您有:

 var localDetails = new List<SyncFile> 
     { 
      new SyncFile { ModifyDate = DateTime.Now, RelativeFilePath = "c:\\help", Id = 1 }, 
      new SyncFile { ModifyDate = DateTime.Now.AddDays(1), RelativeFilePath = "c:\\wow", Id = 2 }, 
      new SyncFile { ModifyDate = DateTime.Now, RelativeFilePath = "c:\\y", Id = 6 }, 
     }; 

     var remoteDetails = new List<SyncFile>() 
     { 
      new SyncFile { ModifyDate = DateTime.Now.AddDays(-1), RelativeFilePath = "c:\\help", Id = 3 }, 
      new SyncFile { ModifyDate = DateTime.Now.AddDays(5), RelativeFilePath = "c:\\wow", Id = 4 }, 
      new SyncFile { ModifyDate = DateTime.Now, RelativeFilePath = "c:\\x", Id = 5 }, 
     }; 

     var results = localDetails.Join(remoteDetails, l => l.RelativeFilePath, r => r.RelativeFilePath, (lf, rf) => lf.ModifyDate > rf.ModifyDate ? lf : rf); 

     foreach(var result in results) 
     { 
      Console.WriteLine(result.Id); 
     } 

輸出將是ID爲1和4(我剛添加的ID,這樣我會知道哪些是測試目的)。

+0

我之前有過這個解決方案,但認爲連接做了一個聯合,並且只使用「結果」選擇器來解析重複項。我只是想要妥善解決重複,而不是兩個列表的差異,只是沒有意識到這是工作。謝謝! –

+0

@Michael:不用擔心:-) LINQ有很多功能強大的方法,它可能會混淆每個人做和不做的時候:-) –