gpt4 book ai didi

c# - 按相似和相反的元素分组

转载 作者:太空宇宙 更新时间:2023-11-03 16:05:52 24 4
gpt4 key购买 nike

我有以下类型的数据:

   Acct    Date     From    To     Amt1) ABC     today    USD     CAD    100 2) ABC     today    CAD     USD   -250 3) DEF     today    GBP     AUD    300 4) DEF     today    GBP     AUD    200


I need to group the data and sum the amounts. To do that I need to net the opposing currencies so that the result should be:

   Acct    Date     From    To     Amt1) ABC     today    CAD     USD   -150 2) DEF     today    GBP     AUD    500 


I am using .Net 3.5.I've only been able to net data that have the same from and to currencies:

var net = data.GroupBy(x=> new { x.Acct, x.Date, x.From, x.To})
.Select new {y.Key.Acct, y.Key.Date, y.Key.From, y.Key.To, Net = y.Sum(x => x.Amt)});

有没有办法同时计算相似货币和相反货币的净值?

最佳答案

编辑 到最后对第二个代码块的解释和一个重要的粗体免责声明。

var query = from acct in accts
select new
{
acct.From,
acct.To,
acct.Amount,
FirstOrientedAmount = ((acct.From.CompareTo(acct.To) == -1 && acct.Amount < 0) ||
(acct.From.CompareTo(acct.To) >= 0 && acct.Amount > 0)) ? acct.Amount : 0,
SecondOrientedAmount = ((acct.From.CompareTo(acct.To) >= 0 && acct.Amount < 0) ||
(acct.From.CompareTo(acct.To) == -1 && acct.Amount > 0)) ? acct.Amount * -1 : 0
} into r
group r by new
{
First = (r.From.CompareTo(r.To) == -1 ? r.From : r.To),
Second = (r.From.CompareTo(r.To) == -1 ? r.To : r.From)
} into g
select new
{
First = g.Sum(acctval => acctval.FirstOrientedAmount) + g.Sum(acctval => acctval.SecondOrientedAmount) > 0 ? g.Key.Second : g.Key.First,
Second = g.Sum(acctval => acctval.FirstOrientedAmount) + g.Sum(acctval => acctval.SecondOrientedAmount) > 0 ? g.Key.First : g.Key.Second,
FTotal = g.Sum(acctval => acctval.FirstOrientedAmount),
STotal = g.Sum(acctval => acctval.SecondOrientedAmount),
Total = g.Sum(acctval => acctval.FirstOrientedAmount) + g.Sum(acctval => acctval.SecondOrientedAmount),
};

这给出:

CAD USD -150
GBP AUD 500

编辑:我放弃了旧代码,因为我并不完全理解这些要求,但我发布了一些不依赖编译器来优化它的东西:

var query = from p in accts
select new
{
p.From,
p.To,
p.Amount,
OrientedAmount = ((p.From.CompareTo(p.To) == -1 && p.Amount < 0) ||
(p.From.CompareTo(p.To) >= 0 && p.Amount > 0)) ? p.Amount : p.Amount * -1
} into r
group r by new
{
First = (r.From.CompareTo(r.To) == -1 ? r.From : r.To),
Second = (r.From.CompareTo(r.To) == -1 ? r.To : r.From)
} into g
select new
{
g.Key.First,
g.Key.Second,
Total = g.Sum(val => val.OrientedAmount)
} into last
select new
{
First = last.Total > 0 ? last.Second : last.First,
Second = last.Total > 0 ? last.First : last.Second,
Total = last.Total
};
  1. 它的工作原理是首先将所有金额定向到一笔交易,该交易的发件人账户是按字典顺序排列的最大货币名称。如果当前交易行实际上正在将资金转移到字典序最小的货币名称,则您可以翻转金额上的符号。

  2. 现在按字典顺序对交易中的账户进行分组。

  3. 选择总计(这样我们只需要做一次)。为此,添加所有定向量。

  4. 如果总值为正(我这样做的方式),我们就有一个净值进入按字典顺序排列的最大货币名称。如果为负数,则净值将进入按字典顺序排列的最小货币名称。

但是,我不认为这些是好的要求(或者我误解了最初的要求)。如果您看一下这个问题解决的是什么问题,它会将“A B 卖出”、“A B 买入”、“B A 买入”和“B A 卖出”组合成一组。 “A B 100”在这种情况下表示“A B -100”。第一个意思是买 100 A。第二个意思是把 100 B 卖给 A。如果你看看这个问题的解决方式 它们是一回事。 但实际上, 它们不是一回事。 卖出 100 B 不会给你与买入 100 A 相同数量的 A。你需要汇率来规范这一点。

关于c# - 按相似和相反的元素分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19463105/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com