林克集团的问题没有总结
本文关键字:问题 林克 | 更新日期: 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
所做评估的判别式,因此,将仅相差该属性的两个元素放入两个不同的组中。