実際には別の Select を使用する必要はありません。GroupBy メソッドのオーバーロードの 1 つを使用することで、'keySelector' および 'resultSelector' パラメーターを使用してグループと合計の両方を組み合わせることができます。
GroupBy は非常に強力なメソッドで、最初は非常に気が遠くなる可能性がありますが、理解すれば、非常に簡単で非常に用途の広い方法です。
以下に例を示します。結果が集約された WorkOrderItems のリストが各グループに 1 つずつ作成されます。匿名オブジェクトのリストを返すのではなく。複数のキー セレクター (group by 句) を使用してこれを拡張し、結果のオブジェクトの合計と操作のすべての方法を実行できます...
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 で最も過小評価されているメソッドの 1 つについてさらに読むには、Jon Skeet による次のブログ投稿を参照することを強くお勧めし
ます。 objects-part-21-groupby/