我改变了我的问题。 我想知道是否可以使用Linq获得与我的代码相同的结果。 我有一个包含许多pdf文件的文件夹。 我需要将创建日期少于10秒的所有文件分组并合并这些文件。
我做了代码,但我想知道我是否可以使用Linq。
我的代码是:
_period = 10;
DirectoryInfo di = new DirectoryInfo(_path);
List<FileInfo> files = di.GetFiles().OrderByDescending(d => d.CreationTime).ToList();
List<String> pdffiles = new List<String>();
if (files.Count > 0)
{
DateTime previous = files.FirstOrDefault().CreationTime;
TimeSpan delay = new TimeSpan(0, 0, _period);
foreach (var file in files)
{
if (file.CreationTime - previous <= delay)
pdffiles.Add(file.FullName);
}
}
我想知道Linq有一种方法可以在没有循环的情况下获得相同的结果吗? 希望我的代码比我的描述更明确。
谢谢。 卡里姆。
答案 0 :(得分:2)
你可以使用它。
string _path = @"C:\Temp";
int _period = 10;
TimeSpan delay = new TimeSpan(0, 0, _period);
DirectoryInfo di = new DirectoryInfo(_path);
var files = di.GetFiles()
.OrderByDescending(d => d.CreationTime)
.Select((d, i) => new { File = d, Index = i }).ToList();
List<String> pdffiles = files.Join(files, f1 => f1.Index, f2 => f2.Index - 1, (f1, f2) => new { f1, f2 })
.Where(f => Math.Abs( f.f1.File.CreationTime.Subtract(f.f2.File.CreationTime).Seconds ) <= delay.Seconds)
.Select(f => f.f1.File.FullName)
.ToList();
答案 1 :(得分:0)
如果我理解正确,你可以试试这个......
string _path = @"C:\Temp";
int _period = 10;
TimeSpan delay = TimeSpan.FromSeconds(_period);
DirectoryInfo di = new DirectoryInfo(_path);
List<String> pdffiles = di.GetFiles().TakeWhile(f =>
{
if (maxDate == null)
{
maxDate = f.CreationTime.Subtract(delay);
}
return f.CreationTime >= maxDate;
}).Select(f => f.FullName).ToList();