2011-11-02 63 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有很多功能强大的方法,它可能会混淆每个人做和不做的时候:-) –