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

C#中如何对JArray内的JObject进行多列分组?

解决C#中JArray多列分组的问题

问题原因

直接用JToken作为匿名类型成员做分组键时,可能因JToken的比较逻辑不符合预期(比如不同JToken实例对应相同值却未被判定为相等,或null值处理异常),导致分组失效。

解决方案

将分组列的JToken转换为对应的CLR类型(如string、int、DateTime等),确保分组键的相等性判断准确。

示例代码

var tableJsonGroup = tableJson.GroupBy(x => new 
{
    FirstColumn = x["FirstColumn"].Value<string>(), // 根据列实际数据类型调整泛型参数
    SecondColumn = x["SecondColumn"].Value<int>(),
    FifthColumn = x["FifthColumn"].Value<DateTime>()
}).ToList();

补充说明

  • JToken.Value<T>()方法可安全将JToken转为指定CLR类型,若JToken为null或无法转换,会返回对应类型的默认值(如string返回null、int返回0)。
  • 若不确定列的具体类型,或希望保留原始值的字符串形式比较,可改用ToString()(需注意格式一致性):
    var tableJsonGroup = tableJson.GroupBy(x => new 
    {
        FirstColumn = x["FirstColumn"]?.ToString(),
        SecondColumn = x["SecondColumn"]?.ToString(),
        FifthColumn = x["FifthColumn"]?.ToString()
    }).ToList();
    
  • 若需特殊处理null值(比如将null视为相等),可显式判断JToken类型:
    var tableJsonGroup = tableJson.GroupBy(x => new 
    {
        FirstColumn = x["FirstColumn"] is JValue jv1 ? jv1.Value : null,
        SecondColumn = x["SecondColumn"] is JValue jv2 ? jv2.Value : null,
        FifthColumn = x["FifthColumn"] is JValue jv3 ? jv3.Value : null
    }).ToList();
    

验证分组结果

可通过遍历分组结果确认是否正确:

foreach (var group in tableJsonGroup)
{
    Console.WriteLine($"分组键:First={group.Key.FirstColumn}, Second={group.Key.SecondColumn}, Fifth={group.Key.FifthColumn}");
    Console.WriteLine($"组内元素数量:{group.Count()}");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 04:45:14