You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取IGrouping<'a, Foo>的计数?基于分组构建ViewModel列表

解决Linq分组转ViewModel列表的问题

嘿,我来帮你搞定这个分组转换的需求!其实思路很清晰:先遍历每个分组,根据分组内元素的数量决定是批量生成ViewModel还是单个生成,最后把所有结果收集到目标列表里。

直观的循环实现方案

假设你的SomeList是IEnumerable<IGrouping<(int OrderId, DateTime DateTime), Foo>>类型(用元组打包了OrderID和DateTime作为分组键),Foo是包含OrderLines信息的原始实体,ViewModel是你定义的视图模型类,代码可以这么写:

// 初始化目标视图模型列表
List<ViewModel> viewModelList = new List<ViewModel>();

// 遍历每个分组
foreach (var orderGroup in SomeList)
{
    // 从分组键中获取当前订单的ID和时间
    var orderId = orderGroup.Key.OrderId;
    var orderDateTime = orderGroup.Key.DateTime;

    if (orderGroup.Count() > 1)
    {
        // 分组包含多条OrderLines,遍历每个子项生成ViewModel
        foreach (var orderLine in orderGroup)
        {
            viewModelList.Add(new ViewModel
            {
                OrderId = orderId,
                OrderDateTime = orderDateTime,
                // 映射OrderLine的具体属性,比如行ID、产品名、数量等
                OrderLineId = orderLine.OrderLineId,
                ProductName = orderLine.ProductName,
                Quantity = orderLine.Quantity
                // 其他需要的属性...
            });
        }
    }
    else
    {
        // 分组只有一条OrderLine,直接取第一个元素生成ViewModel
        var singleOrderLine = orderGroup.First();
        viewModelList.Add(new ViewModel
        {
            OrderId = orderId,
            OrderDateTime = orderDateTime,
            OrderLineId = singleOrderLine.OrderLineId,
            ProductName = singleOrderLine.ProductName,
            Quantity = singleOrderLine.Quantity
            // 其他需要的属性...
        });
    }
}

更简洁的Linq链式调用写法

如果喜欢更紧凑的代码风格,用SelectMany可以把嵌套逻辑合并成一行链式代码,效果和上面的循环完全一致:

List<ViewModel> viewModelList = SomeList
    .SelectMany(group =>
        // 根据分组数量选择生成逻辑
        group.Count() > 1
            ? group.Select(line => new ViewModel
              {
                  OrderId = group.Key.OrderId,
                  OrderDateTime = group.Key.DateTime,
                  OrderLineId = line.OrderLineId,
                  ProductName = line.ProductName,
                  Quantity = line.Quantity
              })
            : new[] { new ViewModel
              {
                  OrderId = group.Key.OrderId,
                  OrderDateTime = group.Key.DateTime,
                  OrderLineId = group.First().OrderLineId,
                  ProductName = group.First().ProductName,
                  Quantity = group.First().Quantity
              } })
    .ToList();

几个关键注意点

  • 分组的Key属性就是你分组时指定的OrderID和DateTime组合,不管你用的是元组还是匿名类型,都可以直接通过group.Key.XXX访问这两个值
  • 要确保Foo类里包含了你需要的OrderLines相关字段(比如OrderLineId、产品信息等),这样才能正确映射到ViewModel
  • 如果你的分组键用的是匿名类型(比如groupBy(f => new { f.OrderID, f.DateTime })),代码逻辑完全不变,只是访问键属性时用group.Key.OrderID即可

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:24:08