修复GetCount函数:统计JSON中指定属性的出现次数
修正C#统计指定属性出现次数的函数
我有如下JSON数据,已经创建了对应的C#实体类,想要实现GetCount函数来统计JSON中指定属性的出现次数。调用GetCount(ProductImportData,"ID")时期望返回结果2,但我编写的函数存在问题,请帮忙修正。
JSON数据
{ "ProductImportData": { "ProductsToImport": [{ "ImportMode": "Update", "DateInfo": { "LastModifiedDate": "2022-04-04T17:30:15.8609796Z" }, "Values": [{ "Name": "ID", "ValuesByLocale": { "en-US": "101" } }] }, { "ImportMode": "Update", "DateInfo": { "LastModifiedDate": "2018-05-05T16:36:41.1106642Z" }, "Values": [{ "Name": "ID", "ValuesByLocale": { "en-US": "102" } }] }, { "ImportMode": "Update", "DateInfo": { "LastModifiedDate": "2016-05-05T16:36:41.1106642Z" }, "Values": [{ "Name": "Name", "ValuesByLocale": { "en-US": "Product Name" } }] } ] } }
C#实体类
public class DateInfo { public DateTime LastModifiedDate { get; set; } } public class ProductImportData { public List<ProductsToImport> ProductsToImport { get; set; } } public class ProductsToImport { public string ImportMode { get; set; } public DateInfo DateInfo { get; set; } public List<Value> Values { get; set; } } public class Root { public ProductImportData ProductImportData { get; set; } } public class Value { public string Name { get; set; } public ValuesByLocale ValuesByLocale { get; set; } } public class ValuesByLocale { [JsonProperty("en-US")] public string EnUS { get; set; } }
我尝试编写的函数(存在问题)
public static int GetCount(ProductImportData productImportData, string attribute) { List<string> values = productImportData.ProductsToImport .Where(pti => pti.Values.Any(v => v.Name == attribute)) .Select(pti => pti.Values.Any(k => k.ValuesByLocale.EnUS)); if (values.Count > 0) { return values.Count; } }
修正后的函数及说明
你的函数存在三个核心问题:
- 类型不匹配:
Select返回的是IEnumerable<bool>(Any方法返回布尔值),但你试图赋值给List<string>,编译会直接报错。 - 缺少默认返回值:如果没有符合条件的项,函数没有返回值,不符合C#语法要求。
- 冗余逻辑:
Select里的pti.Values.Any(k => k.ValuesByLocale.EnUS)完全多余,和统计指定属性的需求无关。
根据你期望返回2的需求,这里提供两种常见场景的修正方案:
方案1:统计包含指定属性的ProductsToImport条目数量
public static int GetCount(ProductImportData productImportData, string attribute) { // 处理null避免空引用异常 if (productImportData?.ProductsToImport == null) return 0; return productImportData.ProductsToImport .Count(pti => pti.Values?.Any(v => v.Name == attribute) ?? false); }
方案2:统计所有名称匹配的Value对象总数(适用于单个ProductsToImport包含多个同名属性的场景)
public static int GetCount(ProductImportData productImportData, string attribute) { if (productImportData?.ProductsToImport == null) return 0; return productImportData.ProductsToImport .SelectMany(pti => pti.Values ?? Enumerable.Empty<Value>()) .Count(v => v.Name == attribute); }
两种方案在你的测试数据中都会返回2,你可以根据实际业务需求选择。
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

