2017-10-06 27 views
0

我一直在試圖找出是否有一種方法來使用IEnumerable的Sum方法來減去兩個值而不是將它們相加?使用IEnumerable.Sum來減去LINQ

IEnumerable<T> list = first 
    .Concat(second) 
    .GroupBy(x => new { x.crita, x.critb}) 
    .Select(y => new T 
    { 
     //other fields// 
     vara= y.Sum(z => z.vara), 
     varb= y.Sum(z => z.varb), 
     varc= y.Sum(z => z.varc), 
     vard= y.Sum(z => z.vard) 
    }); 

我使用這種方法獲得兩個IEnumerables之間的和,我已經加入了,但我希望能夠減掉它們。

任何幫助將非常感激。

此外,如果有人能告訴我如何獲得產品和商,那真是太棒了!

+0

你能舉一些例子數據和輸出嗎?雖然我們可以提供一些直接的解決方案,但我不確定你在做什麼是正確的方法 –

+2

什麼會減去'IEnumerable'看起來像?從第一個減去所有後續的?從零減去它們全部?將它們相減然後求和結果?同樣商數。它們都是二元運算符,它們的順序或值都很重要(不像添加和乘以哪個順序無關)。在我們告訴你如何在LINQ中做到這一點之前,你需要告訴我們你想要的東西。 – Chris

+0

在我看來,在你正在做的事情中,你可能確實有一個保證,你將只有兩個項目的每個標準組合,在這種情況下,我的問題的答案更容易,但它可能不是最好的做事方式(因爲它不會顯而易見你在做什麼)。 – Chris

回答

3

AggregateSum的哥哥,也可以做減法和其他聚合。另一方面,如果您想要逐元素減法,則可以使用一般Select預測。

閱讀您的評論,一個簡單的技巧將創建否定varavarb等,然後使用相同的Sum函數來計算羣體的聚集你的第二個IEnumerable的投影。所以基本上你只需要做a + (-b)而不是a - b。在以下幾行:

IEnumerable<T> list = first 
        .Concat(second.Select(n => new T() { vara = -n.vara...}) 
        .GroupBy(x => new { x.crita, x.critb}) 
        .Select(y => new T 
        { 
         //other fields// 
         vara= y.Sum(z => z.vara), 
         varb= y.Sum(z => z.varb), 
         varc= y.Sum(z => z.varc), 
         vard= y.Sum(z => z.vard) 
        }); 
+0

哦!這實際上很酷。謝謝! 你會碰巧知道我可以在Aggregate上讀到哪裏,所以我也可以實現乘法和除法? – Seiche

+0

@ Seiche:你可以閱讀關於Aggregate [here](https://msdn.microsoft.com/en-us/library/bb548651(v = vs.110).aspx)。 – dotNET

+0

@downvoter:想分享一些東西嗎? – dotNET