2009-10-16 53 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對象的集合有些納悶。我不知道我看到的是與類層次結構衝突的名稱空間層次結構,還是使用嵌套類或什麼。我知道我不喜歡它。

相關問題