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

无法从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:56:30