c#Linq组间隔文件

时间:2018-01-24 10:21:43

标签: c# linq group-by

我改变了我的问题。 我想知道是否可以使用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有一种方法可以在没有循环的情况下获得相同的结果吗? 希望我的代码比我的描述更明确。

谢谢。 卡里姆。

2 个答案:

答案 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();