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

