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

C#遍历字典提取整数值键值对生成新字典的优化方案咨询

现有代码存在的问题
  • 强制将entry.Value转换为string:如果字典中值的实际类型不是字符串(比如本身就是int、long、小数等其他类型),会直接抛出InvalidCastException异常,健壮性不足
  • 逻辑与需求不符:需求明确要求值为字符串类型则不纳入新字典,但现有代码反而只处理能被解析为int的字符串值,完全违背需求规则
符合需求的实现方案

需求规则:仅保留值本身为整数类型的键值对,排除所有字符串类型的键值对,可选实现如下:

1. 常规遍历写法(可读性最高,便于后续扩展额外处理逻辑)

public override object Save(IDictionary<string, object> value)
{
    IDictionary<string, object> newValues = new Dictionary<string, object>();
    foreach(var entry in value)
    {
        // 先排除所有字符串类型的值
        if (entry.Value is string) 
            continue;
        // 判断值是否为int类型
        if (entry.Value is int intValue)
        {
            newValues.Add(entry.Key, intValue);
        }
        // 若需要兼容short、long等其他整数类型,可以扩展判断逻辑:
        // else if (entry.Value is long longVal && longVal is >= int.MinValue and <= int.MaxValue)
        // {
        //     newValues.Add(entry.Key, (int)longVal);
        // }
    }
    return base.Process(newValues);
}

2. LINQ链式写法(代码更简洁,适合无额外中间处理的场景)

public override object Save(IDictionary<string, object> value)
{
    var newValues = value
        .Where(kv => kv.Value is not string && kv.Value is int)
        .ToDictionary(kv => kv.Key, kv => kv.Value);
    return base.Process(newValues);
}
特殊场景适配

如果你的实际需求是「排除原始类型为字符串的值,其余类型只要能解析为有效int就保留」,可以调整判断逻辑如下:

if (entry.Value is not string && int.TryParse(entry.Value.ToString(), out var id))
{
    newValues.Add(entry.Key, id);
}

如果你的实际需求是「只保留可以解析为int的字符串值,其余类型都排除」,可以调整判断逻辑如下,避免强制转换报错:

if (entry.Value is string strVal && int.TryParse(strVal, out var id))
{
    newValues.Add(entry.Key, id);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:42:05