2011-04-10 38 views
7

對象的集合,我有一個對象模型是這樣的:總和包含數值屬性只與LINQ

public class Quantity 
{ 
    public decimal Weight { get; set; } 
    public decimal Volume { get; set; } 
    // perhaps more decimals... 

    public static Quantity operator +(Quantity quantity1, Quantity quantity2) 
    { 
     return new Quantity() 
     { 
      Weight = quantity1.Weight + quantity2.Weight, 
      Volume = quantity1.Volume + quantity2.Volume 
     }; 
    } 
} 

public class OrderDetail 
{ 
    public Quantity Quantity { get; set; } 
} 

public class Order 
{ 
    public IEnumerable<OrderDetail> OrderDetails { get; set; } 
} 

現在我想在Order類應該總結的大量引進一個只讀屬性TotalQuantity所有OrderDetails。

我想知道是否有更好「LINQ辦法」比這

public class Order 
{ 
    // ... 
    public Quantity TotalQuantity 
    { 
     get 
     { 
      Quantity totalQuantity = new Quantity(); 
      if (OrderDetails != null) 
      { 
       totalQuantity.Weight = 
        OrderDetails.Sum(o => o.Quantity.Weight); 
       totalQuantity.Volume = 
        OrderDetails.Sum(o => o.Quantity.Volume); 
      } 
      return totalQuantity; 
     } 
    } 
} 

這不是因爲它通過訂單明細兩次迭代一個很好的解決方案。而這樣的事情是不支持(即使+運營商正處在由量的類提供):

Quantity totalQuantity = OrderDetails.Sum(o => o.Quantity); // doesn't compile 

是否有更好的方法來構建LINQ總和?

(只是爲了理論興趣,一個簡單的foreach循環也會做,當然它的工作做好。)

感謝您的反饋!

回答

16

嘗試:

OrderDetails.Select(o => o.Quantity).Aggregate((x, y) => x + y) 

如果你不希望有新的產品數量對象的開銷,對於每一次加(RE評論),你可以使用類似:

new Quantity { 
    Weight = OrderDetails.Select(o => o.Quantity.Weight).Sum(), 
    Volume = OrderDetails.Select(o => o.Quantity.Volume).Sum() 
}; 

不與第一個一樣好,並且比簡單的foreach循環略微更尷尬(並且更慢?)。

你可以找到更多關於Aggregate()方法on MSDN

+0

在這種情況下,您不需要WhateverProperty,因爲TotalQuantity返回一個數量 – 2011-04-10 16:07:48

+0

@Thomas:謝謝。隨着我不斷重新解釋這個問題,我做了一番編輯。解決了這個問題,並沒有想到要解決這個問題。 :) – 2011-04-10 16:14:20

+0

太棒了,它的工作原理!謝謝!我只是想第二次談論我的話,那就是我的問題解決方案不是一個「很好的解決方案」。它只創建一個'Quantity'對象,然後累加小數兩次以構建總和,而使用+重載爲每個二進制添加創建一個新的Quantity對象。我不確定什麼是更好的性能明智,雖然使用+運算符使代碼看起來更友好。但那是另一個問題。 – Slauma 2011-04-10 16:17:57