【发布时间】:2021-04-23 15:31:12
【问题描述】:
我有以下示例列表:
| Index | No | Path | A | B | C | Amount |
|---|---|---|---|---|---|---|
| 1 | 1000 | 1000 | a | b | c | 700 |
| 2 | 1001 | 1000.1001 | a | b | c | 100 |
| 3 | 1001 | 1000.1001 | a | b | d | 200 |
我需要遍历列表,对于每条记录,我需要在列表中计算一个值并根据特定条件将其存储在一个新列中:
- 过滤路径包含记录的否的记录
- 在 A、B 和 C 列中过滤具有相同值的记录
- 计算Amount的总和并保存为TotalAmount
举个例子:
| Index | No | Path | A | B | C | Amount | TotalAmount |
|---|---|---|---|---|---|---|---|
| 1 | 1000 | 1000 | a | b | c | 700 | 800 |
| 2 | 1001 | 1000.1001 | a | b | c | 100 | 100 |
| 3 | 1001 | 1000.1001 | a | b | d | 200 | 200 |
对于第一条记录,我需要在列表中查找 Path 包含记录的 No (1000) 并且在 A 列中具有相同值的所有记录, B 和 C。所以在这个例子中,对于第一条记录,我们取 index = 1 和 index = 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)
}
但是,它没有返回我想要的,我不知道如何在这样的计算后将它保存回列表。
【问题讨论】:
-
似乎“包含”可能是一个有问题的选项(取决于“否”字段)。如果您在第 1000 号记录中,它可能会匹配您不想要的具有该子字符串(例如 10000)的其他记录,如果路径包含 1000、10000 等,则第 100 号也将匹配。如果您知道您只是在搜索 Path 字段的开头,然后尝试使用 StartsWith 之类的方法(并附加一个句点,以免过度抓取)。例如e.Path.StartsWith(record.No + ".")
-
@BryanLewis:我也在想同样的事情,但是根据这条路的“深度”,可能还需要做类似
e.Path.StartsWith(record.No + ".") || e.Path.Contains($".{record.No}.")这样的事情。可能还应该指定一个 Ordinal StringComparison。 -
“它没有返回我想要的”是什么意思?您是说单步执行代码时
totalAmount不正确吗?或者只是它没有设置record的TotalAmount属性?