首页 > 解决方案 > 当按日期净值的总值为零时如何从列表中删除

问题描述

我有一个 C# 交易列表

public class Transaction
{
        public string effectiveDate;
        public string transactionType;
        public double grossAmount;
        public double netAmount;
}

不同的事务类型存储在不同的列表中,这些列表填充了从数据库中提取数据。最后,它会吐出一份逐项交易的声明。

假设我在每月 15 日支付了每月 1.50 美元的管理费。2 月免收手续费,我有一笔冲销交易。所以现在在我的列表中我有

'2020-01-15', 'Admin fee', 1.5, 1.5
'2020-02-15', 'Admin fee', 1.5, 1.5
'2020-02-15', 'Admin fee', -1.5, -1.5
'2020-03-15', 'Admin fee', 1.5, 1.5

如果 2 月的管理费净额为零,我该如何删除或跳过它们?

在其他情况下,我可能在同一天有 10 笔或更多相同类型的交易被撤销,即收到 10 笔付款并在同一生效日期撤销。

是否按日期排序,迭代并保持运行总值,直到我到达一个新日期,然后比较为零最简单/最好的方法?

我知道通过 sum <> 0 在 SQL 中使用 group 更容​​易做到这一点,但是这些值作为带有 $ 和逗号以及前导尾随空格等的字符存储在数据库中,所以我不能那样做。由于各种原因,即使我替换/替换/替换/转换数据也不行。

谢谢

标签: c#list

解决方案


你可以试试Linq,对于给定的列表,说

  var myList = new List<Transaction>() {
    new Transaction() {
      effectiveDate = "2020-01-15",
      transactionType = "Admin fee",
      grossAmount = 1.5,
      netAmount = 1.5},

    new Transaction() {
      effectiveDate = "2020-02-15",
      transactionType = "Admin fee",
      grossAmount = 1.5,
      netAmount = 1.5},

    new Transaction() {
      effectiveDate = "2020-02-15",
      transactionType = "Admin fee",
      grossAmount = -1.5,
      netAmount = -1.5},

    new Transaction() {
      effectiveDate = "2020-03-15",
      transactionType = "Admin fee",
      grossAmount = 1.5,
      netAmount = 1.5},
  };

你可以把 Linq 查询:

  1. 我们GroupBy与相同的交易effectiveDatetransactionType
  2. 检查SumofnetAmount是否不为0
  3. 展平(SelectMany后跟ToList)组返回列表

代码:

  using System.Linq;

  ...

  myList = myList
    .GroupBy(t => new { t.effectiveDate, t.transactionType })
    .Where(group => group.Sum(t => t.netAmount) != 0)
    .SelectMany(group => group)
    .ToList();

推荐阅读