能否用C# Linq替代循环实现与现有代码相同的PDF文件筛选?
用LINQ实现PDF文件筛选的方案
当然可以用LINQ替代循环实现这个需求!核心逻辑和你原来的代码保持一致,只是用LINQ的声明式语法替换了显式循环,代码会更简洁易读。
完整实现代码
这里有两种写法,你可以根据习惯选择:
写法一:链式调用(简洁版)
int _period = 10; DirectoryInfo di = new DirectoryInfo(_path); var sortedFiles = di.GetFiles() .OrderByDescending(file => file.CreationTime) .ToList(); List<string> pdffiles = sortedFiles.Any() ? sortedFiles.Where(file => file.CreationTime - sortedFiles.First().CreationTime <= TimeSpan.FromSeconds(_period)) .Select(file => file.FullName) .ToList() : new List<string>();
写法二:提前缓存基准时间(更高效)
如果文件夹内文件数量特别多,这种写法可以避免多次调用sortedFiles.First(),性能会更优:
int _period = 10; DirectoryInfo di = new DirectoryInfo(_path); var sortedFiles = di.GetFiles() .OrderByDescending(file => file.CreationTime) .ToList(); List<string> pdffiles = new List<string>(); if (sortedFiles.Any()) { DateTime firstFileTime = sortedFiles.First().CreationTime; TimeSpan delay = TimeSpan.FromSeconds(_period); pdffiles = sortedFiles.Where(file => file.CreationTime - firstFileTime <= delay) .Select(file => file.FullName) .ToList(); }
逻辑说明
- 先获取目录下所有文件,并按创建时间降序排序,这一步和你原来的代码完全一致;
- 用
Any()判断是否存在文件,避免空列表时触发空引用异常; - 以第一个文件的创建时间为基准,用
Where筛选出所有创建时间与基准时间间隔≤10秒的文件; - 最后用
Select提取文件的完整路径,转成List<string>类型。
这样就完全替代了原来的foreach循环,用LINQ完成了筛选需求。
内容的提问来源于stack exchange,提问作者karim harfakti
相关产品推荐
相关产品推荐

