2013-08-27 146 views
0

我有點問題,因爲我試圖GroupBy使用LINQ,雖然它的工作原理,它只適用於當我消除代碼的一個元素。Linq Groupby的問題沒有總結

nestedGroupedStocks = stkPositions.GroupBy(x => new { x.stockName, 
            x.stockLongshort,x.stockIsin, x.stockPrice }) 
      .Select(y => new stockPos 
      { 
       stockName = y.Key.stockName, 
       stockLongshort = y.Key.stockLongshort, 
       stockIsin = y.Key.stockIsin, 
       stockPrice = y.Key.stockPrice, 
       stockQuantity = y.Sum(x => x.stockQuantity) 
      }).ToList(); 

上面的代碼組我的股票倉位,並在含47項,但它不能做的是和重複的個股有不同批量的單子,結果...

nestedGroupedStocks = stkPositions.GroupBy(x => new { x.stockName, 
         x.stockIsin, x.stockPrice }) 
      .Select(y => new stockPos 
      { 
       stockName = y.Key.stockName, 
       stockIsin = y.Key.stockIsin, 
       stockPrice = y.Key.stockPrice, 
       stockQuantity = y.Sum(x => x.stockQuantity) 
      }).ToList(); 

但是,如果我elimanate「x.longshort」然後我得到了想要的結果,34只個股總結出來的,但當時的列表中的所有longshort元素是空...

其駕駛我堅果:-)

+0

發佈你的清單數據 –

回答

2

這部分

.GroupBy(x => new { x.stockName,x.stockLongshort,x.stockIsin, x.stockPrice }) 

是問題所在。您嘗試將新對象的元素作爲關鍵字進行分組,但x.stockLongshort很可能會更改爲列表中的每個元素,從而導致GroupBy失敗,除非名稱和stockLongshort在兩個元素中都匹配(對於其他元素2個字段,但我認爲這些字段總是相同的)。

nestedGroupedStocks = stkPositions.GroupBy(x => x.stockName) 
     .Select(y => new stockPos 
     { 
      stockName = y.First().stockName, 
      stockLongshort = y.First().stockLongshort, 
      stockIsin = y.First().stockIsin, 
      stockPrice = y.First().stockPrice, 
      stockQuantity = y.Sum(z => z.stockQuantity) 
     }).ToList(); 

注意,stockLongshort屬性被設置爲等於該組中的第一元素的值。如果這對你更有用,你可以將它設置爲0。

較長的解釋

的GroupBy返回IEnumerable<IGrouping<TKey, TSource>>,即,「設定」(即可以enumarte)羣組的,具有相同的組共享相同Key的每個元素,您已具有限定參數中的lambda表達式。

如果你把x.stockLongshort作爲Key對象的屬性,變成由GroupBy作出評價的判別,即,作爲結果,把剛在兩個不同的羣體,物業不同的兩個元素。

+0

謝謝。這是一種享受。現在我明白了爲什麼使用你的解釋! Muchas Gracias – Timujin

+1

我已經添加了一些更多的文字,使外觀更清晰,至少我希望如此:) – Save