如何返回具有最早日期时间的顶部FileInfo对象?

问题描述:

我需要能够查询本地目录中添加的文件。包含LINQ Query的方法将返回创建日期最早的文件。所以,操作顺序基本上是先进先出的情况。如何返回具有最早日期时间的顶部FileInfo对象?

请注意,我正在返回一个列表,因为要求可能会更改为返回多个文件。

我拿出来实现大部分的这个过程的代码如下:

public static List<FileInfo> GetNextFileToProcess(DirectoryInfo directory) 
{ 
    var files = from f in directory.GetFiles() 
       orderby f.CreationTime ascending 
       select f; 

    return files.Cast<FileInfo>().ToList(); 
} 

的问题是,我已经不局限于这个列表包含并返回后仅索引为0的文件确定排序顺序。

我是否需要一个where子句来限制最旧的文件被返回或什么?

+0

你为什么要调用'Cast'? – 2012-02-07 19:56:54

+0

@JonSkeet因为我返回的对象是一个List,并且IEnumerable不是一个列表,所以需要将其转换为一个来返回它。 – 2012-02-07 19:57:54

+0

这就是为什么你要调用'ToList()',但'Cast()'仍然返回'IEnumerable '。 – 2012-02-07 20:00:54

var files = (from f in directory.EnumerateFiles() 
      orderby f.CreationTime ascending 
      select f).Take(1); 
+0

我不知道你可以像parens一样对整个Linq声明进行“分组”。 – 2012-02-07 19:58:58

+0

你会想'EnumerateFiles()'在这种情况下 – BrokenGlass 2012-02-07 19:59:23

+0

@BrokenGlass:为什么?无论如何,在检索所有文件之前不会有任何结果。 – Tomalak 2012-02-07 20:01:24

你说你想要返回一个列表,以防你以后需要多个文件 - 那么为什么要限制呢?你可能使用Take(1),但为什么不只是把一切都返回给调用者,并让他们他们决定他们想要什么?

如果您打算将其限制为“包含一个元素的列表”,您可以改为返回FileInfo - 如果您要返回多个条目,则需要修改代码。

+0

这是真的。我正在处理一些滚动要求,在我周五开会的时候可能会改变。 – 2012-02-07 20:01:15

+0

+1,1元素列表不太有用。 – Tomalak 2012-02-07 20:18:39

+0

@Tomalak真的,但一直在谈论处理两个文件,所以在这种情况下,我需要目录中最旧的两个文件。我只想看看我怎样才能用列表处理这个问题。 – 2012-02-07 20:24:23