如何通过C# LINQ按文件类型统计数量与总大小?
C# LINQ 查询文件类型、总大小及数量的问题
我想写一个C#方法,用LINQ查询获取文件类型、对应类型文件的总大小以及文件总数。但在获取多列数据和汇总文件大小时遇到了困难,单独查询文件大小可以运行,但无法实现汇总。
单独获取文件大小的代码可以正常运行:
var size = from f in files select (new FileInfo(f).Length);
但下面的代码无法正常运行,也没法统计文件数量:
var all = from f in files group Path.GetExtension(f) by Path.GetExtension(f).ToLower() into fileGroup select new { Ext = fileGroup, Byt = new FileInfo(fileGroup).Length };
编辑补充:我已经实现按类型分组并统计数量,但还是没法汇总对应类型的文件总大小,而且代码里的x报错:
var info = files.Select(f => Path.GetExtension(f).ToLower()).GroupBy(x => x, (t, c) => new { Extension = t, Count = c.Count(), Size = new FileInfo(x).Length
问题分析与解决方案
你的代码主要存在两个核心问题:
- 分组逻辑丢失关键信息:分组时只提取了文件扩展名,丢掉了原文件路径,导致后续无法获取单个文件的大小进行汇总。
FileInfo实例化错误:fileGroup是分组后的扩展名集合,不是单个文件路径,直接用它实例化FileInfo必然报错;补充代码里的x在分组结果选择器中已被t替代,所以会出现找不到x的错误。
正确实现代码
方式1:查询语法
var fileStats = from f in files let ext = Path.GetExtension(f).ToLower() let fileInfo = new FileInfo(f) group fileInfo by ext into fileGroup select new { Extension = fileGroup.Key, Count = fileGroup.Count(), TotalSize = fileGroup.Sum(fi => fi.Length) };
方式2:方法链式语法
var fileStats = files.Select(f => new { Extension = Path.GetExtension(f).ToLower(), FileInfo = new FileInfo(f) }) .GroupBy(item => item.Extension) .Select(group => new { Extension = group.Key, Count = group.Count(), TotalSize = group.Sum(item => item.FileInfo.Length) });
代码说明
- 使用
let关键字提前计算扩展名和FileInfo对象,避免重复计算,同时保留每个文件的完整信息。 - 分组时包含
FileInfo对象,这样分组后可以直接通过集合访问每个文件的Length属性。 - 用
Sum方法对分组内所有文件的大小求和得到总大小,Count方法统计该类型文件的数量。
内容的提问来源于stack exchange,提问作者Julia Navarro
相关产品推荐
相关产品推荐

