簡體   English   中英

當按日期凈值歸零時,如何從列表中刪除

[英]How to remove from a List when total values by date net to zero

我有一個 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 筆付款。

是按日期排序、迭代並保持運行總值直到我到達新日期然后與零進行比較是最簡單/最好的方法嗎?

我知道這在帶有組的 SQL 中通過 sum <> 0 會更容易做到,但是這些值作為帶有 $ 和逗號以及前導尾隨空格等的字符存儲在數據庫中,所以我不能那樣做。 由於各種原因,即使我替換/替換/替換/轉換數據也不會。

謝謝

您可以嘗試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. 檢查Sum netAmount是否為 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();

我認為,您可以使用 LinQ 按天和類型對結果進行分組,然后計算分組元素的總和。 當 sum==0 跳過...

List<Transaction> transactions;
var noUnderZeroFees = transactions.Where(x => x.netAmount > 0).ToList<Transaction>();
//noUnderZeroFees will contains Transaction items with more then Zero netAmount.

嘗試搜索有關 LINQ 的更多信息

您可以使用 Linq:

List<Transaction> loList = new List<Transaction>();
loList.Add(new Transaction()
{
    effectiveDate = "2020-01-15",
    transactionType = "Admin fee",
    grossAmount = 1.5,
    netAmount = 1.5
});
loList.Add(new Transaction()
{
    effectiveDate = "2020-02-15",
    transactionType = "Admin fee",
    grossAmount = 1.5,
    netAmount = 1.5
});
loList.Add(new Transaction()
{
    effectiveDate = "2020-02-15",
    transactionType = "Admin fee",
    grossAmount = -1.5,
    netAmount = -1.5
});
loList.Add(new Transaction()
{
    effectiveDate = "2020-03-15",
    transactionType = "Admin fee",
    grossAmount = 1.5,
    netAmount = 1.5
});

foreach (var loGTrans in loList.GroupBy(item => new { item.transactionType, item.effectiveDate }).Where(item => item.Sum(t => t.netAmount) != 0))
{
    Console.WriteLine($"Type: {loGTrans.Key.transactionType}, Date: {loGTrans.Key.effectiveDate} -> Gross-Sum: ${loGTrans.Sum(item => item.grossAmount)} Net-Sum:${loGTrans.Sum(item => item.netAmount)}");
}

您首先GroupBy() transactionType,然后計算每個組的 netAmount 的Sum() 使用Where()語句,您只包含適合過濾器的組,然后使用SelectMany()解散這些組

    private IEnumerable<Transaction> FilterNetZero(IEnumerable<Transaction> list)
    {
        return list.GroupBy(s => s.transactionType)
                   .Where(group => group.Sum(s => s.netAmount) != 0)
                   .SelectMany(group => group);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM