我想从文件列表中只选择总大小不超过阈值的文件(即目标驱动器上的可用空间量)。
我知道我可以通过在循环中添加文件大小直到达到阈值,然后使用该数字从列表中选择文件来做到这一点。但是,是否可以使用 LINQ 查询来做到这一点?
最佳答案
您可以通过使用闭包来实现:
var directory = new DirectoryInfo(@"c:\temp");
var files = directory .GetFiles();
long maxTotalSize = 2000000;
long aggregatedSize = 0;
var result = files.TakeWhile(fileInfo =>
{
aggregatedSize += fileInfo.Length;
return aggregatedSize <= maxTotalSize;
});
但是有一个警告,因为变量
aggregatedSize
可能会在您离开定义它的范围后被修改。您可以将其包装在扩展方法中 - 这将消除闭包:
public static IEnumerable<FileInfo> GetWithMaxAggregatedSize(this IEnumerable<FileInfo> files, long maxTotalSize)
{
long aggregatedSize = 0;
return files.TakeWhile(fileInfo =>
{
aggregatedSize += fileInfo.Length;
return aggregatedSize <= maxTotalSize;
});
}
你最终使用了这样的方法:
var directory = new DirectoryInfo(@"c:\temp");
var files = directory.GetFiles().GetWithMaxAggregatedSize(2000000);
编辑: 我用
Where
-method 替换了 TakeWhile
-method。一旦达到阈值,TakeWhile
-extension 将停止,而 Where
-extension 将继续。提出 TakeWhile
-extension 的功劳归于 Tim Schmelter。