c# - LINQ:基于子列表中的属性分组

标签 c# .net linq grouping

我正在尝试使用 LINQ 创建基于元数据的文档分组列表,元数据是文档上的列表。

下面是我的对象结构:

List<Document>
         --> List<Metadata>
                      --> Metadata has a name and a value property.

我想根据名称为 ID 的元数据标签对文档进行分组,并在 ID 属性值相同的地方对它们进行分组。

我试过这样的:

var x = response.Document
         .GroupBy(d => d.Metadata.Where(dc => dc.Name == DocProperty.ID)
         .Select(dc => dc.Value));

这会生成单个文档的列表,但不会按 ID 分组。

还考虑过选择一个不同的 ID 列表,然后循环遍历文档列表并找到与该 ID 匹配的文档。这看起来开销很大,因为对于不同列表中的每个 ID,我每次都必须进入元数据列表并找到文档,并且必须额外检查找到的多个项目,获取我需要的属性等。

有人知道如何让这个东西工作吗?

最佳答案

var x = from doc in source
        from meta in doc.Metadata
        where meta.Name == DocProperty.Id
        group doc by meta.Value;

或(评论)作为流利的符号:

var y = source
    .SelectMany(doc => doc.Metadata, (doc, meta) => new { doc, meta })
    .Where(pair => pair.meta.Name == DocProperty.Id)
    .GroupBy(pair => pair.meta.Value, pair => pair.doc);

关于c# - LINQ:基于子列表中的属性分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5258093/

相关文章:

c# - 查询 Linq 加入多对多

c# - Expression.Invoke - 它有什么作用?

.net - 为什么 OpenSubKey() 在我的 Windows 7 64 位系统上返回 null?

c# - 查找任何文件编码的有效方法

c# - Gmail API - 值 '= Get Labels google-api-dotnet-client/1.25.0.0 (gzip)' 的格式无效

c# - .NET C# - 将父控件传递给分页 .ascx 控件?

c# - 在自定义类的 IEnumerable 中对具有特定 ID 的项目求和

c# - 如何在字典集合中使用 LINQ 将 TimeSpans 添加到一起

c# - Linq 查询中的表达式

c# - 如果静态只读成员调用静态方法获取值,是否同步完成?