您实际上不必使用单独的 Select,通过使用 GroupBy 方法的重载之一,您可以使用 'keySelector' 和 'resultSelector' 参数来组合 group 和 sum。
GroupBy 是一种非常强大的方法,一开始可能会让人望而生畏,但一旦你开始了解它,它就会相当直接且用途广泛。
这是一个示例,它创建了一个 WorkOrderItems 列表,每个组一个,结果汇总在其中;而不是返回一个匿名对象列表。您可以使用多个键选择器(按子句分组)对其进行扩展,并对结果对象进行各种求和和操作...
class Program
{
static void Main(string[] args)
{
var myItems = new List<WorkOrderItem>
{
new WorkOrderItem { OrderId = 1, ItemName = "A", ItemQuantity = 0 },
new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 1 },
new WorkOrderItem { OrderId = 0, ItemName = "A", ItemQuantity = 2 },
new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 3 },
new WorkOrderItem { OrderId = 0, ItemName = "B", ItemQuantity = 4 },
new WorkOrderItem { OrderId = 1, ItemName = "B", ItemQuantity = 5 },
new WorkOrderItem { OrderId = 0, ItemName = "C", ItemQuantity = 6 },
};
int myId = 0;
List<WorkOrderItem> groupedItems =
myItems.Where(i => i.OrderId == myId)
.GroupBy(
//key selector
i => i.ItemName,
//result selector
(name, items) =>
{
var aggregatedItem = new WorkOrderItem
{
OrderId = myId,
ItemName = name,
ItemQuantity = items.Sum(i => i.ItemQuantity)
};
return aggregatedItem;
})
.ToList();
}
class WorkOrderItem
{
public int OrderId { get; set; }
public string ItemName { get; set; }
public int ItemQuantity { get; set; }
}
}
要进一步阅读 Linq 中最被低估的方法之一,我强烈建议您查看 Jon Skeet 的这篇博客文章:http:
//codeblog.jonskeet.uk/2011/01/01/reimplementing-linq-to-对象-part-21-groupby/