gpt4 book ai didi

c# - 重构 LINQ ...从列表中乘以属性和子属性

转载 作者:太空宇宙 更新时间:2023-11-03 14:13:10 26 4
gpt4 key购买 nike

我仍在接受 LINQ,我正在尝试将以下 foreach 循环重构为它的 LINQ 等效项。这是我要转换的 foreach 循环;

var NetTotal = 0M;

foreach (var cheque in ListOfCheques)
{
var exchangeRate = (from exc in cheque.ExchangeRates
where exc.Type == EnumExchangeRate.ForCheque
select exc).FirstOrDefault();

NetTotal = exchangeRate != null ? NetTotal + cheque.NetAmount * exchangeRate.Rate : NetTotal + cheque.NetAmount;
}

return NetTotal ;

以及我提出的 LINQ 代码;

var NetTotal = (from cheque in ListOfCheques
join exc in ListOfCheques.SelectMany(b => b.ExchangeRates) on cheque.ID equals exrate.Cheque.ID into chequeWithRate
where income.ExchangeRates.Select(x => x.Type).Equals(EnumExchangeRate.ForCheque)
from ur in chequeWithRate.DefaultIfEmpty()
select ur).Sum(x => x.Cheque.NetAmount * x.Rate);

return NetTotal;

我纠结的重点;

  1. Check 类中的“ExchangeRates”列表可能不存在,即它不需要汇率。
  2. 如果没有找到汇率,它应该默认为 1。我该如何设置...我希望在 DefaultIfEmpty(1) 内设置它。

非常感谢任何帮助。

最佳答案

与任何重构一样,只是一点一点地进行。首先,不是 foreach 而是像这样使用 Sum()

return ListOfCheques.Sum(c =>
{
var exchangeRate = (from exc in c.ExchangeRates
where exc.Type == EnumExchangeRate.ForCheque
select exc).FirstOrDefault();
return c.NetAmount * (exchangeRate ?? new ExchangeRate(){ Rate = 1 }).Rate;
});

(如果 ExchangeRate.Rate 属性的默认值为 1 就好了)

我会将 exchangeRate 函数重写为一种简单的格式。您确定要使用 FirstOrDefault 而不是 SingleOrDefault 吗?

var exchangeRate = c.ExchangeRates.
FirstOrDefault(ex => ex.Type == EnumExchangeRate.ForCheque);

然后这可以交换到第一个语句中,将生成的最终产品留在下面。

如果你想要它,一个衬垫!

return ListOfCheques.Sum(c => c.NetAmount * 
(c.ExchangeRates.FirstOrDefault(ex => ex.Type == EnumExchangeRate.ForCheque)
?? new ExchangeRate() { Rate = 1 }).Rate);

编辑

对??的澄清新汇率()

而不是执行 != null ? (amount * rate) : (rate) 我更喜欢将 ExchangeRate 对象与 Rate = 1 的新此类对象合并。我认为这提供了一段更流畅、更清晰的代码。我强烈建议您将默认 Rate 设置为 1.0,然后您可以简单地与 new ExchangeRate() 合并,而无需设置 Rate 属性。

要在新的 ExchangeRate 对象中为 Rate 设置默认值,只需将初始化程序放在构造函数中

class ExchangeRate
{
public ExchangeRate()
{
this.Rate = 1.0;
}
// other stuff
}

关于c# - 重构 LINQ ...从列表中乘以属性和子属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7169581/

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