我可以使用linq来实现这个foreach循环所做的相同的事情吗?

时间:2009-10-16 14:13:04

标签: c# linq

这是我拥有的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循环更快......这是真的吗?

5 个答案:

答案 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个对象的集合。我不知道我所看到的是一个与类层次结构冲突的命名空间层次结构,或者您是否正在使用嵌套类,或者是什么。我知道我不喜欢它。