c# - 根据过滤列表计算列表中每条记录的总计

标签 c# linq

我有以下示例列表:

<表类=“s-表”> <标题> 索引 否 路径 一个 B C 金额 <正文> 1 1000 1000 一个 b c 700 2 1001 1000.1001 一个 b c 100 3 1001 1000.1001 一个 b d 200

我需要迭代列表,对于列表中的每条记录,我需要计算一个值并根据特定条件将其存储在新列中:

  • 过滤路径包含记录的记录
  • 过滤 A、B 和 C 列中具有相同值的记录
  • 计算金额总和并将其保存为TotalAmount

举个例子:

<表类=“s-表”> <标题> 索引 否 路径 一个 B C 金额 总金额 <正文> 1 1000 1000 一个 b c 700 800 2 1001 1000.1001 一个 b c 100 100 3 1001 1000.1001 一个 b d 200 200

对于第一条记录,我需要查找列表中 Path 包含记录的 No (1000) 且 A 列中具有相同值的所有记录、B 和 C。因此,在第一条记录的示例中,我们获取索引 = 1 和索引 = 2 的记录,计算金额总和并将其返回到 TotalAmount 列中。

我有这样的想法:

foreach (record in List)
{
    var totalAmount = List
        .Where(e => 
            e.Path.Contains(record.No) && 
            e.A == record.A && 
            e.B == record.B && 
            e.C == record.C)
        .Sum(e => e.Amount)
}

但是,它没有返回我想要的结果,而且我不知道如何在计算后将其保存回列表中。

最佳答案

如果您没有从 Sum 运算中获得正确的结果,可能是由于 Contains 方法返回了您不想要的记录(因为 10000 包含例如 1000)。处理该问题的一种方法是在检查值的开头、中间和结尾时添加句点。

另一个问题如前面的答案所述 - 您需要设置记录的 TotalAmount 属性(假设有一个):

foreach (var record in list)
{
    record.TotalAmount = list
        .Where(e => 
            (e.Path.StartsWith($"{record.No}.") ||
            e.Path.Contains($".{record.No}.") ||
            e.Path.EndsWith($".{record.No}")) && 
            e.A == record.A && 
            e.B == record.B && 
            e.C == record.C)
        .Sum(e => e.Amount)
}

关于c# - 根据过滤列表计算列表中每条记录的总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67232819/

相关文章:

c# - 使用 .Net 技术开发智能卡读卡器

mysql - 使用 LINQ 获取具有多对多关系的子表的所有记录

c# - 拆分重叠日期范围的最快方法

c# - 将 Linq 查询结果投影到复杂对象上

c# - 检查字符串是否已存在于表中

c# - 按值对字典进行排序 - 降序 THEN 字母 C#

sql-server - LINQ(到 Oracle)- Row_Number() Over Partition By

c# - 以抽象类的子类数组作为参数的构造函数

c# - 基于值的 XSL 匹配元素

c# - 将对象数组传递给 webapi