Linq通过相对文件路径选择最新文件

时间:2011-11-02 18:49:17

标签: c# linq

我有两个文件列表,一个来自本地驱动器,另一个来自远程驱动器。文件排列在相同的相对路径位置,我想将两个列表合并为一个只包含两个列表中具有相同相对路径的文件的列表。我还想确保结果列表中没有重复项,但是在相对路径中具有更大时间戳的文件被选中到最终列表中。

我的列表名为localDetails和remoteDetails,类型为SyncFile,并且具有成员RelativeFilePath和ModifyDate。

我尝试使用与自定义相等比较器的交叉,它只查看相对文件路径,但无法弄清楚如何从碰撞中选择最大时间戳。我也尝试过使用Concat然后使用GroupBy,但是无法使用它。

1 个答案:

答案 0 :(得分: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,所以我知道哪个是用于测试目的的。)