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);
}