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
相关产品推荐
相关产品推荐

