你可以使用这样的事情:
var fees = from fee in schoolFeesResult
let weight = fee.Amount.Value/totalFees
select new
{
TuitionFee = weight * fee.TuitionFee.Value,
TravellingFee = weight * fee.TravellingFee.Value,
ResidentialFee = weight * fee.ResidentialFee.Value
};
// if the calculation of the fees is a performance bottleneck,
// uncomment the next line:
// fees = fees.ToList();
return new SchoolFees(
new Percentage(fees.Sum(x => x.TuitionFee),
new Percentage(fees.Sum(x => x.TravellingFee),
new Percentage(fees.Sum(x => x.ResidentialFee));
你甚至能走得更远:
var fees = (from fee in schoolFeesResult
let weight = fee.Amount.Value/totalFees
group fee by 1 into g
select new
{
TuitionFee = g.Sum(x => weight * x.TuitionFee.Value),
TravellingFee = g.Sum(x => weight * x.TravellingFee.Value),
ResidentialFee = g.Sum(x => weight * x.ResidentialFee.Value)
}).Single();
return new SchoolFees(
new Percentage(fees.TuitionFee,
new Percentage(fees.TravellingFee,
new Percentage(fees.ResidentialFee);
但我怀疑,这第二个版本是一个好主意。它使代码难以理解。我纯粹出于学术原因添加了它,以展示什么是可能的。
+1:很好,我喜欢它。注意:这也将枚举'schoolFeesResult'三次。 –
@DanielHilgarth谢谢!是的,它枚举了三次,但它不错:)顺便说一句,没有什么区别 - 枚举三次(原始代码),但我不计算每个'重量*费用':) –
它会计算每个重量(' x.Amount.Value/totalFees')三次,就像原始代码一样。就像原始代码一样,它只会计算每个单独的“重量*费用”。所以,就计算而言,它是一样的。只是更多的风格:) –