【问题标题】:Getting x number of files after a certain file在某个文件之后获取x个文件
【发布时间】:2015-02-21 02:06:21
【问题描述】:

我有一个包含 Jpeg 文件的文件夹,我想在对它们进行排序后一次提取 3-4 个文件以了解它们的最后写入时间。问题是我想指定一个开始位置(按文件名)并且只从那里拉。

带有图片的目录示例,

  • a.jpg
  • b.jpg
  • c.jpg
  • d.jpg
  • e.jpg
  • f.jpg
  • 等直到 j.jpg

现在我想从 b.jpg 开始获取 3 个文件,这意味着我要对文件进行排序,搜索特定文件(在本例中为 b.jpg),然后获取 b 之后的以下 3 个文件。 jpg(上例中为 c.jpg、d.jpg 和 e.jpg)。

如何使用 LINQ 或更好的方法找到 b.jpg 的索引,在同一个查询中获取 3 个文件?

index of file/the files directly = Directory.GetFiles(pathToFiles, "*.jpg").Select(x => new FileInfo(x)).OrderByDescending(x => x.LastWriteTime)... ?

【问题讨论】:

  • 由于Directory.GetFiles返回string[],所以可以使用string[].IndexOf方法查找索引。听起来你可以从那里拿走它。老实说,我不知道人们在学习数组等基础知识之前是如何学习 LINQ 的。

标签: c# linq file fileinfo


【解决方案1】:

您需要研究SkipWhile 扩展方法、Skip 扩展方法,然后是Take 扩展方法。

此外,请改用Directory.EnumerateFiles


var files = Directory.EnumerateFiles(pathToFiles, "*.jpg")
                     .Select(x => new FileInfo(x))
                     .OrderByDescending(x => x.LastWriteTime)
                     .SkipWhile(x => !String.Equals(x.Name, "b.jpg")
                     .Skip(1)
                     .Take(3);

基本上,一旦你有你的有序序列,跳过所有内容,直到你到达“b.jpg”文件,然后跳过那个文件,然后取接下来的三个。


更新:现在我想起来了,EnumerateFiles 会有所帮助,但并非完全有帮助,因为您通过排序否定了延迟执行。但是,这仍然是一个微小的优势(我认为)。

【讨论】:

  • SkipWhile( 行缺少第二个右括号
  • 也可以直接使用new DirectoryInfo(pathToFiles).EnumerateFiles("*.jpg")代替Directory.EnumerateFiles(pathToFiles, "*.jpg").Select(x => new FileInfo(x)),这样我们就不需要在每个项目上创建new FileInfo
猜你喜欢
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2021-11-24
  • 1970-01-01
  • 2015-03-04
  • 2014-11-18
  • 1970-01-01
相关资源
最近更新 更多