无法从OrderedDictionary取值?键类型匹配问题排查
问题分析与解决方案
这是OrderedDictionary这类弱类型集合的典型陷阱——键的类型不匹配,导致数值相同但类型不同的键被判定为不同项,最终返回null。
核心原因
OrderedDictionary的键匹配严格依赖对象的类型+值,而非仅数值相等。从你的代码逻辑看:
- 添加元素时用的是
newElt.ID作为键(大概率是int类型,多数业务ID会用int定义) - 取值时你传入的是
long类型的idElt(代码里明确声明long idElt = -1;)
虽然数值都是104,但int 104和long 104是两个完全不同的对象,OrderedDictionary会将它们视为不同键,自然找不到对应值。
快速验证方法
调试时可以加一段代码,确认字典中键的实际类型:
foreach (var key in ifcList.Keys) { Console.WriteLine($"键值:{key},类型:{key.GetType().Name}"); } Console.WriteLine($"待查找idElt:{idElt},类型:{idElt.GetType().Name}");
运行后就能直观看到两者的类型差异。
修复方案
根据类型一致性原则,有两种可靠的修复方式:
方案1:统一键的类型为long
如果希望全程用long作为键,在添加元素时就把ID转换为long:
newGroupList.ListIfcElements.Add((long)newElt.ID, newElt);
这样后续用long类型的idElt取值就能精准匹配。
方案2:取值时将idElt转换为与添加时一致的类型
如果newElt.ID是int类型,取值时把idElt转成int(注意先判断数值范围避免溢出):
if (idElt <= int.MaxValue && idElt >= int.MinValue) { object objectFound = ifcList[(object)(int)idElt]; IfcElement newElt = (IfcElement)objectFound; retour.Add(newElt); this.addChildren(newElt); } else { this.ErrorFound = true; this.ListItemsNotFound.Add(idElt); }
额外优化建议
如果不需要严格保持插入顺序,推荐用泛型Dictionary<TKey, TValue>(比如Dictionary<long, IfcElement>)替代OrderedDictionary——泛型集合在编译阶段就能检查类型匹配,从根源避免这类运行时错误。如果必须保留插入顺序,务必全程保证键的类型完全一致。
内容的提问来源于stack exchange,提问作者Siegfried.V
相关产品推荐
相关产品推荐

