这是我拥有的c#代码:
private double get806Fees (Loan loan)
{
Loan.Fee.Items class806;
foreach (Loan.Fee.Item currentFee in loan.Item.Fees)
{
if (currentFee.Classification == 806) class806.Add(currentFee);
}
// then down here I will return the sum of all items in class806
}
我可以使用linq吗?如果是这样,怎么样?我从来没有使用过linq,而且我在几个地方读过使用linq而不是foreach循环更快......这是真的吗?
答案 0 :(得分:4)
loan.Item.Fees.
Where(x => x.Classification == 806).
Sum(x => x.SomeValueProperty)
是否更快是值得商榷的。 IMO,两者的复杂性都相同,非LINQ版本可能更快。
答案 1 :(得分:4)
与一些现有答案类似,但在查询中进行投影,使Sum
调用更加简单:
var sum = (from fee in loan.Items.Fees
where fee.Classification == 806
select fee.SomeValueToSum).Sum();
答案 2 :(得分:2)
var q =
from currentFee in loan.Item.Fees
where currentFee.Classification == 806
select currentFee;
var sum = q.Sum(currentFee => currentFee.Fee);
答案 3 :(得分:1)
private double get806Fees(Loan loan)
{
return load.Item.Fees.
Where(f => f.Classification == 806).
Sum(f => f.ValueToCalculateSum);
}
我在这里假设ValueToCalculateSum
也是双倍的。如果不是那么你必须在它返回之前转换它。
答案 4 :(得分:0)
到目前为止,所有答案都假定您总结loan.Fees
。但是您实际发布的代码调用Items.Add()
将Item
中的每个loan.Fees.Items
添加到Items
对象,而Items
对象(而不是{{1}你也想要总结一下,这也是一个loan.Fees
对象。
现在,如果Items
只是一个简单的集合类,那么除了人们在这里提出的建议之外,没有必要做任何事情。但是如果我们不知道的Items
方法有一些副作用(或者更糟糕的是,你不知道),那么简单地总结一个Add
对象的过滤列表可能没有给你你想要的结果。
你仍然可以使用Linq:
Item
我承认我对这里隐含的类层次结构感到有点困惑,但 foreach (Loan.Fee.Item currentFee in loan.Item.Fees.Where(x => x.Classification == 806)
{
class806.Add(currentFee);
}
return class806.Sum(x => x.Fee)
属性是Loan.Item.Fees
个对象的集合。我不知道我所看到的是一个与类层次结构冲突的命名空间层次结构,或者您是否正在使用嵌套类,或者是什么。我知道我不喜欢它。