You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 16:10:28