C# 根据运行总数选择条目

C# 根据运行总数选择条目,c#,linq,C#,Linq,我只想从文件列表中选择其总大小不超过阈值(即目标驱动器上的可用空间量)的文件 我知道我可以通过在循环中添加文件大小来实现这一点,直到达到阈值,然后使用该数字从列表中选择文件。但是,可以用LINQ查询来代替吗 您可以通过使用闭包来实现: var directory = new DirectoryInfo(@"c:\temp"); var files = directory .GetFiles(); long maxTotalSize = 2000000; long aggregatedSize

我只想从文件列表中选择其总大小不超过阈值(即目标驱动器上的可用空间量)的文件


我知道我可以通过在循环中添加文件大小来实现这一点,直到达到阈值,然后使用该数字从列表中选择文件。但是,可以用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;
});
您最终将使用如下方法:

var directory = new DirectoryInfo(@"c:\temp");
var files = directory.GetFiles().GetWithMaxAggregatedSize(2000000);
编辑:我用
TakeWhile
-方法替换了
Where
-方法。一旦达到阈值,
TakeWhile
-扩展将停止,而
Where
-扩展将继续。蒂姆·施梅尔特(Tim Schmelter)获得了启动TakeWhile扩展名的积分。

这可能会起作用(
文件是一个
列表
):

var availableSpace=DriveInfo.GetDrives()
.First(d=>d.Name=@“C:\”).AvailableFreeSpace;
长期使用的空间=0;
var availableFiles=文件
.TakeWhile(f=>(usedSpace+=f.Length)
在写我的答案时,我没有想到要花时间,这是一个很好的答案!但也要注意这个答案中修改过的闭包。您可以通过将代码包装在扩展方法中来避免这种情况。非常感谢您的回答。经过编辑,我相信@Spontifix的答案是比较完整的。
var directory = new DirectoryInfo(@"c:\temp");
var files = directory.GetFiles().GetWithMaxAggregatedSize(2000000);
var availableSpace = DriveInfo.GetDrives()
    .First(d => d.Name == @"C:\").AvailableFreeSpace;
long usedSpace = 0;
var availableFiles = files
    .TakeWhile(f => (usedSpace += f.Length) < availableSpace);
foreach (FileInfo file in availableFiles)
{
    Console.WriteLine(file.Name);
}