林克集团的问题没有总结

本文关键字:问题 林克 | 更新日期: 2023-09-27 18:29:06

我遇到了一个小问题,因为我试图使用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();

然而,如果我省略了"x.longshort",那么我得到了想要的结果,总共有34只股票,但列表中的所有longshort元素都为空。。。

它让我抓狂:-)

林克集团的问题没有总结

本部分

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

就是问题所在。您正试图按该新对象作为关键字对元素进行分组,但列表中的每个元素都很可能会更改x.stockLongort,从而使GroupBy失败,除非名称和stockLongort在两个元素中匹配(对于其他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();

请注意,stockLongsort属性设置为等于组中第一个元素的值。如果这对你更有用的话,你可以把它设置为0

更长的解释

GroupBy返回IEnumerable<IGrouping<TKey, TSource>>,即Groups的"集合"(您可以枚举),同一组的每个元素共享相同的Key,这是您在参数中使用lambda表达式定义的。

如果将x.stockLongsort作为Key对象的一个属性,这将成为GroupBy所做评估的判别式,因此,将仅相差该属性的两个元素放入两个不同的组中。