0

我在尝试使用 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 元素都是空的......

它让我发疯:-)

4

1 回答 1

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>>,即组的“集合”(您可以枚举),同一组的每个元素共享相同的Key,您在参数中使用 lambda 表达式定义。

如果您将 x.stockLongshort 作为Key对象的属性,这将成为由 进行的评估的判别式,GroupBy因此,将仅通过该属性不同的两个元素放在两个不同的组中。

于 2013-08-27T12:56:14.150 回答