使用 where 过滤后求和。先调用 groupby 分组,再对每组应用 where 筛选满足条件的元素,最后用 sum 计算总和。

如何按指定键分组并筛选特定状态的数据?
通过 GroupBy 指定分组键,在投影中结合 Where 排除不符合条件的项。例如只统计状态为 "Active" 的记录。

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var records = new List<record>
{
new Record { Category = "A", Status = "Active", Value = 10 },
new Record { Category = "A", Status = "Inactive", Value = 20 },
new Record { Category = "B", Status = "Active", Value = 30 },
new Record { Category = "B", Status = "Active", Value = 40 }
};
var result = records
.GroupBy(r => r.Category)
.Select(g => new
{
Key = g.Key,
Sum = g.Where(r => r.Status == "Active").Sum(r => r.Value)
});
foreach (var item in result)
{
Console.WriteLine($"Category: {item.Key}, Sum: {item.Sum}");
}
}
}
public class Record
{
public string Category { get; set; }
public string Status { get; set; }
public int Value { get; set; }
}</record>
预期输出:Category: A, Sum: 10;Category: B, Sum: 70。
如何处理分组后没有满足条件数据的空值情况?
当某组内没有满足 Where 条件的元素时,Sum 会返回默认值(如 int 的 0)。若需区分无数据与和为 0,可检查 Count 或使用 DefaultIfEmpty。

using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var records = new List<record>
{
new Record { Category = "A", Status = "Active", Value = 10 },
new Record { Category = "B", Status = "Inactive", Value = 20 }
};
var result = records
.GroupBy(r => r.Category)
.Select(g => new
{
Key = g.Key,
HasData = g.Any(r => r.Status == "Active"),
Sum = g.Where(r => r.Status == "Active").Sum(r => r.Value)
});
foreach (var item in result)
{
Console.WriteLine($"Category: {item.Key}, HasData: {item.HasData}, Sum: {item.Sum}");
}
}
}
public class Record
{
public string Category { get; set; }
public string Status { get; set; }
public int Value { get; set; }
}</record>
预期输出:Category: A, HasData: True, Sum: 10;Category: B, HasData: False, Sum: 0。
基于程序中某个输入、条件或结果的具体问题
在上面的代码中,输入是包含不同状态记录的列表,条件是筛选 Status 为 "Active" 的记录,结果是每个类别下满足条件记录的 Value 之和。对于类别 "B",由于所有记录的状态都是 "Inactive",因此没有满足条件的记录,Sum 返回 0。










