问题标签 [tdictionary]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
delphi - TDictionary - 无效键
我有这样的代码:
随机我看到 'v := myDict.Items[k];' 上抛出异常 其中说 k 无效。
还有人看到这个吗?
delphi - 如何在 Delphi 2009 中按键按字母顺序列出 TDictionary?
如何使用 TEnumerator 按键按排序顺序浏览我的 TDictionary?
我有这样的事情:
所以我想按顺序处理我的字典:Dumb、Early、HelpMe、Tired。
不幸的是,Delphi 的帮助在描述一般的枚举器和 TEnumerator 的具体工作方式方面非常少,并且没有给出我能找到的示例。网上也很少有关于在 Delphi 中使用枚举器和泛型的文章。
而且我上面的示例代码甚至没有使用 TEnumerator,所以我对这一切是如何设计使用的感到困惑。
谢谢巴里,你的回答。
自从我问这个问题以来,我对泛型的冒险很有趣。我想开始在我的代码中实现它们。“排序”问题有点令人困惑,因为泛型似乎内置了处理排序的方法,但没有很好的示例或文档说明如何做到这一点。
最后,我按照 Barry 的建议做了,并在 Dictionary 中建立了一个外部索引。不过,感觉还是不太对。
然而,我有另一个惊喜:我试图用通用的 TDictionary 替换Gabr的GPStringHash。使用泛型的代码更简洁一些。但底线是 TDictionary 比 Gabr 慢 3 倍多。对 TryGetValue 的 1,704,667 次调用耗时 0.45 秒,但对 Gabr 例程的相同操作耗时 0.12 秒。我不知道为什么,但也许它就像 Gabr 一样简单,具有更快的哈希函数和分桶组合。或者,也许泛型必须针对每种情况进行泛化,这本质上会减慢速度。
尽管如此,也许 Barry 或其他 Delphi 开发人员应该看看这一点,因为 3 倍的加速最终可以使每个人受益。如果可以选择,我个人会更早地使用语言中内置的内容,而不是第三方包(甚至与 Gabr 的包一样好)。但现在,我会坚持使用 GPStringHash。
delphi - 在 Delphi TDictionary 中,我的 Value 对象插入为 null
我正在使用 Delphi 9 的 TDictionary 泛型类。我的 TDictionary 看起来像这样:
而且,所以我像这样初始化 TDictionary:
我有一个 TList,我也在初始化,这样我就可以用它来填充 TDictionary。我正在循环一些用于填充 TList/TDictionary 的文件数据,并且我试图重新使用相同的 TList 作为值插入到 TDictionary 中。在第一次插入 TDictionary 时,项目的 TList 值存在并且其中包含数据。在第二次和随后的迭代中,TList 值全部为零。
在我看来,这一切都是通过参考来完成的。如何按值而不是引用将 TList 添加到我的 TDictionary?
delphi - 如何从 TDictionary 中获取密钥?
我有一个TDictionary<TKeyClass, TValueClass>
.
我想完成类似的事情
我不能再访问这些密钥了,如果我完全知道它们,我就可以使用它们。
唯一的选择是创建一个TDictionary<TValueClass, TKeyValue>
?所以我可以通过按键循环?
我发现的解决方法是创建一个TList<TKeyClass>
,但这是我不喜欢的。
delphi - TDictionary 的 Equals 和 GetHashCode
如果我使用 TDictionary 在 Delphi 中实现关系 Car <-> Owner,我应该如何实现 IEqualityComparer 的 Equals 和 GetHashCode 函数?(GetHashCode 返回一个 Integer,用于 TDictionary 中的散列。)
对于 TVehicle 类,假设它有一个 VIN(车辆识别号)。
我应该如何实现 VIN 的哈希码?
更新:在这个例子中,对象身份并不意味着“两个对象指针的内存位置的身份”,而是“同一对象的两个实例的身份,基于其属性的唯一和不变(“不可变”)组合” .
因此,我不需要通过地图中的内存地址搜索车辆,而是需要具有我正在寻找的 id 的车辆。
考虑一个包含车主数据的数据库,在应用程序启动时加载到字典中。现在,如果用户在申请表中输入 VIN,应用程序如何在字典中找到车辆?VehicleFactory.CreateVehicleFromDatabase(Edit1.Text);
如果代码使用并在字典中搜索此对象创建一个新实例,则 Equals 的默认实现将不会在映射中找到任何条目,因为它会查找内存地址。为了找到车辆,Equals 需要比较 VIN。
所以我必须创建一个自定义的 IEqualityComparer。实现 Equals 是微不足道的。但是 GetHashCode 呢?对于字符串属性,我不能简单地使用字符串的地址(请参阅Are Delphi strings immutable中的 Berry Kelly :“如果您从两个单独的代码部分创建相同的字符串,它们将不会共享相同的后备存储”) ,因此字符串属性的 GetHashCode 函数需要自定义实现。
我还发现我发现了如何使用 Delphi 散列字符串?- 有一个例子,其中包含HashValue('Hello World')
delphi - delphi字典迭代
早安!
TDictionary<String, TStringlist>
我用字符串作为值和几个字符串作为值填充字典(delphi-collections-unit)。就像是:
- 姓名 = 约翰、丽莎、斯坦
- 技能 = 读、写、说
- 年龄 = 12、14、16
(当然没有“,”)。我需要的是迭代这个字典并将值与键相乘。输出应该像
- 姓名 = 约翰技能 = 阅读年龄 = 12
- 姓名 = 约翰技能 = 阅读年龄 = 14
- 姓名 = 约翰技能 = 阅读年龄 = 16
- 姓名 = 约翰技能 = 写年龄 = 12
- 姓名 = 约翰技能 = 写年龄 = 14
- 姓名 = 约翰技能 = 写年龄 = 16
- ...
- 姓名 = 丽莎技能 = 阅读年龄 = 12
- ...
- 姓名 = 斯坦技能 = 说话年龄 = 16
所以每一个组合。我该怎么做?键的数量是动态的,tstringlist 的大小也是动态的。谢谢!现在解决了...
现在是范围的问题。以下是填充字典的过程。subsplits 和 splitstring 是字符串列表,它们在过程结束时被释放。dict是在程序块之后创建的(在main中?它是如何调用的?),调用填充方法,然后我想像代码示例中那样进行递归,但是dict中没有值... .
delphi - delphi变量范围问题
我填写一个从文件中读取的字典,以迭代键值对。迭代在delphi 字典迭代中得到解决。
问题是 dict 中的值没有保留,可能是变量的范围问题。我更习惯于 java ......在将它们分配给过程 parsetextfile 中的字典后,这些值确实存在,然后迷路了:
delphi - 如何为从 TDictionary 派生的类创建自定义枚举器?
我已经定义了一个从 TDictionary 派生的集合,并且需要定义一个应用附加过滤器的自定义枚举器。
我被卡住了,因为我无法访问 TDictionary FItems 数组(它是私有的),所以我无法定义 MoveNext 方法
您将如何继续在从 TDictionary 派生的类上重新定义过滤枚举数?
这是一个简单的代码来说明我想要做什么:
delphi - 有没有一种简单的方法可以将 TDictionary 内容复制到另一个中?
是否有一种方法或简单的方法可以将一个 TDictionary 内容复制到另一个?假设我有以下声明
我想将 Source 1:1 复制到 Target。有这样的方法吗?
谢谢!