[英]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 查詢:
GroupBy
交易與同effectiveDate
和transactionType
Sum
netAmount
是否為 0SelectMany
后跟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.