当按日期净值计算的总值为零时,如何从列表中删除



我有一个交易的C#列表

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

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

比方说,我每月有1.5美元的管理费在每月15日支付。在二月份,费用被免除,我有一笔冲销交易。所以现在在我的列表中我有

'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

如果二月的管理费为零,我该如何删除或跳过?

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

按日期排序、迭代并保持值的总数直到我到达一个新的日期,然后将其与零进行比较是最简单/最好的方法吗?

我知道在SQL with group中,如果sum<gt;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. 我们用相同的effectiveDatetransactionType进行GroupBy事务
  2. 检查netAmountSum是否不为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);
}

最新更新