【问题标题】:Linq GroupBy and select other attributes as listLinq GroupBy 并选择其他属性作为列表
【发布时间】:2017-07-20 14:18:40
【问题描述】:

如何使用 LINQ 按属性分组并选择其他属性作为列表?

我不擅长解释,所以这里有一个例子:

假设我有一个可以用 JSON 表示的 C# 对象列表,如下所示:

[
    { "id":123, "name":"John", "carId":1, "carAge":3 },
    { "id":123, "name":"John", "carId":2, "carAge":4 },
    { "id":4, "name":"Mary", "carId":3, "carAge":3 },
    { "id":4, "name":"Mary", "carId":4, "carAge":3 },
    { "id":123, "name":"John", "carId":5, "carAge":3 }
]

在所有这些对象中,只有 carId 是唯一的。

我想按人员详细信息对它们进行分组,并将这些详细信息与联网汽车详细信息结合起来。

最终结果看起来像这样,但作为 c# 对象:

[
    {"id":123, "name":"John",
        [
            {"carId":1, "carAge":3},
            {"carId":2, "carAge":4},
            {"carId":5, "carAge":3}
        ]
    },
    {"id":4, "name":"Mary",
        [
            {"carId":3, "carAge":3},
            {"carId":4, "carAge":3}
        ]
    }
]

编辑:

我被卡住了

list.GroupBy(x => new { x.Id, x.Name })

因为我不需要任何聚合函数,只需要选择。

我很抱歉没有发布更多代码,这是一个简化版本,真实的东西有更多的过滤和复杂的领域特定术语。

一切都在内存中完成 - 无需担心数据库。

【问题讨论】:

  • 请展示您尝试过的内容。我们可以从那里提供帮助。有很多来源可以查看如何分组和项目
  • 提供minimal reproducible example 也会让事情变得更简单。看起来这是一个简单的 GroupBy 操作,您可以在其中指定单独的键和元素选择器,但使用代码更容易确定。
  • stackoverflow.com/questions/2280183/… 应该可以帮助您。似乎按复合键分组 - 您需要从 2 个值开始
  • 我理解并同意,但实际代码变得复杂,我认为这会分散问题的注意力,所以不幸的是,这是我现在能做的最好的事情。我做了这个过于简单的例子,以便更好地解释我的问题。

标签: c# linq


【解决方案1】:

group _ by _ 表达式的每个部分创建一个包含所需字段的匿名对象。

通过以下任何一种方式,您将为每个键构建一个嵌套集合 - 当使用 GroupBy 时,它不仅与聚合有关,而且与对特定数据组的操作有关。一种情况是聚合方法。

var result = from item in data
             group new { item.carId, item.carAge }  by new {item.id, item.name} into g
             select g;

另一种方法是

var result = from item in data
             group  by new {item.id, item.name} into g
             select new {
                 g.Key,
                 Data = g.Select(i => new {i.carId, i.carAge})
             };

使用方法语法,您可以使用以下重载:

var result = data.Group(k => new {k.id, k.name},
                        e => new {e.carId, e.carAge});

或者如果不是,只需添加一个Select 进行投影:

var result = data.Group(k => new {k.id, k.name})
                 .Select(g => new {
                     g.Key,
                     Data = g.Select(i => new {i.carId, i.carAge})
                 });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 2011-11-25
    • 1970-01-01
    • 2014-09-15
    相关资源
    最近更新 更多