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

LINQ查询求助:提取Parts类Data字典Number键值并按Id分组

正确提取并分组Parts数据的LINQ解决方案

看起来你的LINQ代码逻辑有点混乱,不仅编译会出错,也没实现按Parts.Id分组并提取Number键值对的需求。我来帮你整理出正确的实现方式:

需求回顾

我们需要从People.Parts集合中:

  • 提取每个Parts对象里Data字典中包含"Number"(兼容大小写,比如示例里的小写"number")的键值对
  • 按Parts.Id进行分组
  • 最终得到包含Parts.Id、Number键及其对应值的结果

完整LINQ解决方案

考虑到鲁棒性(比如兼容大小写、处理Data中可能有多个类似Number的键),可以用以下代码:

using System.Linq;
using System;

// 假设msf是已初始化的People实例
var result = msf.Parts
    // 先为每个Parts提取Id和符合条件的Number键值对
    .Select(part => new 
    {
        PartId = part.Id,
        NumberItems = part.Data
            // 筛选键包含"Number"的条目,忽略大小写
            .Where(kv => kv.Key.IndexOf("Number", StringComparison.OrdinalIgnoreCase) >= 0)
            .Select(kv => new { Key = kv.Key, Value = kv.Value })
            .ToList()
    })
    // 按Parts的Id分组
    .GroupBy(item => item.PartId)
    // 转换为最终的结果结构
    .Select(group => new 
    {
        PartId = group.Key,
        NumberEntries = group.SelectMany(g => g.NumberItems).ToList()
    })
    .ToList();

简化版(如果满足特定前提)

如果你的业务能保证:

  • 每个Parts的Data字典一定存在包含"Number"的键(大小写任意)
  • 每个Parts的Id是唯一的,不需要分组合并

可以用更简洁的代码:

var simplifiedResult = msf.Parts
    .Select(part => new 
    {
        PartId = part.Id,
        NumberValue = part.Data
            .First(kv => kv.Key.IndexOf("Number", StringComparison.OrdinalIgnoreCase) >= 0)
            .Value
    })
    .ToList();

原代码的问题分析

你原来的代码有两个核心问题:

  1. 编译错误:第一个Select里的s是Data.Keys筛选后的字符串键,它没有Value属性,所以.Select(s => s.Value)会报错
  2. 逻辑缺失:没有关联Parts.Id,也没有实现按Id分组的逻辑,完全偏离了需求

示例数据对应的结果

针对你提供的JSON示例,简化版代码会返回如下结构的列表:

[
  { "PartId": "234567", "NumberValue": "1" },
  { "PartId": "3424242", "NumberValue": "2" }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:51:56