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

修复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;
    }

}

修正后的函数及说明

你的函数存在三个核心问题:

  1. 类型不匹配:Select返回的是IEnumerable<bool>(Any方法返回布尔值),但你试图赋值给List<string>,编译会直接报错。
  2. 缺少默认返回值:如果没有符合条件的项,函数没有返回值,不符合C#语法要求。
  3. 冗余逻辑: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 13:30:41