如何通过LINQ关联双列表并按卡片名称分组统计总数量?
按卡片名称分组统计总数量的解决方案
你的代码已经完成了两个列表的关联和初步投影,但缺少对分组后数量的聚合计算,导致只得到了分组的键,没有统计总数量。以下是两种修正方案:
方案一:直接分组聚合(更简洁高效)
在关联后直接按卡片名称分组,同时聚合数量总和,省去中间投影步骤:
var values = from r in records join c in cards on r.CardGUID equals c.GUID group r.Quantity by c.Name into grouped orderby grouped.Key ascending select new { Name = grouped.Key, TotalQuantity = grouped.Sum() };
方案二:基于原代码修改
如果想保留先投影再分组的逻辑,只需在GroupBy后添加Select来计算每组的数量总和:
var values = (from r in records join c in cards on r.CardGUID equals c.GUID select new { Name = c.Name, Quantity = r.Quantity }) .GroupBy(item => item.Name) .Select(group => new { Name = group.Key, TotalQuantity = group.Sum(item => item.Quantity) }) .OrderBy(result => result.Name);
关键说明
GroupBy的作用是将数据按指定键(这里是卡片名称)分组,返回的分组对象包含Key(分组键)和可枚举的分组元素。- 必须通过
Sum()方法对每组内的Quantity进行求和,才能得到相同名称卡片的总数量。 - 排序操作放在聚合之后更合理,避免对未聚合的大量数据排序。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

