2009-10-16 54 views
2

下面是我的C#代码:我可以使用linq来实现这个foreach循环所做的同样的事情吗?

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

回答

4

一些现有的答案相似,但这样做在查询投影,使Sum电话简单了很多:

var sum = (from fee in loan.Items.Fees 
      where fee.Classification == 806 
      select fee.SomeValueToSum).Sum(); 
4
loan.Item.Fees. 
    Where(x => x.Classification == 806). 
    Sum(x => x.SomeValueProperty) 

不管是否更快是否有争议。国际海事组织,这两个复杂性是相同的,非LINQ版本可能会更快。

+0

虽然这是真的,但我个人比非LINQ更青睐LINQ版本,因为我认为它更清楚地表达其意图,代码更少。 – David 2009-10-16 15:18:55

1
private double get806Fees(Loan loan) 
{ 
    return load.Item.Fees. 
     Where(f => f.Classification == 806). 
     Sum(f => f.ValueToCalculateSum); 
} 

我在这里假设ValueToCalculateSum也是双倍。如果不是,那么你必须在它返回之前将其转换。

2
var q = 
    from currentFee in loan.Item.Fees 
    where currentFee.Classification == 806 
    select currentFee; 

var sum = q.Sum(currentFee => currentFee.Fee); 
0

所有的答案至今都假设你的总结up loan.Fees。但是您实际发布的代码调用Items.Add()来将Item中的每个loan.Fees.Items都添加到一个Items对象,并且它是您说要总结的对象(而不是loan.Fees,也是一个Items对象)。

现在,如果Items只是一个简单的集合类,那么除了人们在这里提出的建议外,没有必要做任何事情。但是,如果我们不知道Add方法的某些副作用(或者更糟糕的是,您不知道),只需简单地总结Item对象的已过滤列表可能无法为您提供结果寻找。

你仍然可以使用Linq:

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属性是Loan.Fee.Item对象的集合有些纳闷。我不知道我看到的是与类层次结构冲突的名称空间层次结构,还是使用嵌套类或什么。我知道我不喜欢它。

相关问题