问题标签 [trygetvalue]

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.

0 投票
0 回答
31 浏览

c# - 用随机缺失的属性覆盖 GetHashCode

我有基于自定义类的字典。在继承 IEquatable 接口时,我遇到了覆盖 GetHashCode() 的问题。我的类对象具有三个属性:

  1. Id1(字符串)
  2. Id2(字符串)
  3. Id3(字符串)

我正在从两个不同的来源检索数据,并根据上述自定义类从这些集合中创建字典。在某些情况下,一个数据源填充了上述 id 中的两个,而另一个数据源只填充了一个 id。例如,

Collection1 = {Object{Id1 = null, Id2 = "NewId2", Id3 = "NewId3"}}

Collection2 = {Object{Id1 = null, Id2 = null, Id3 = "NewId3"}}

也有在 collection2 中 Id3 为空但 Id2 不为空的情况。对于这种情况,我不确定如何覆盖 GetHashCode()。我已经尝试过 if-elseif-else 块,但是在某些极端情况下,此逻辑会失败:

在我的情况下,似乎没有特定的顺序有效。对于更多上下文,我正在尝试使用 .NET 中字典中的 TryGetValue 方法。我查看了源代码,发现他们在那里使用 GetHashCode() 来按键搜索,这就是我通过错误跟踪到这个函数的方式。有谁知道解决这个问题的方法?

编辑:添加一些示例以阐明正确的行为

Edit2:当至少两个对象之间的 id 相等时,就会发生匹配。为了便于讨论,假设以下哈希码映射,

0 投票
2 回答
79 浏览

c# - 为什么字典上的 TryGetValue 的键也是返回 Null 的字典?

目标:从字典中获取一个值。所述值具有字典作为键。

我在做什么:我正在创建第二个字典,它的值与我试图获取的键的值完全相同。使用TryGetValue

结果:期望一个值但得到空值;

背景: 我正在尝试在 Unity 中制作制作功能。这就是工艺成分类的样子(ICombinable 现在看起来完全一样):

在实践中,我希望用户能够将 ICombinable 类型的对象拖到 UI(未实现)上并按下按钮将它们组合成一个新项目。例如,2 种药草和 1 杯水返回治疗药水(一种新物品)。

在表面后面,我会将拖动/选择的对象存储Dictionary<ICombinable, int>在 int 是 per 的数量ICombinable

在另一个类中,我正在存储另一个字典,它将保存所有的食谱。

_recipebook 的关键是由成分及其数量组成的实际配方。ICraftable 是与该配方对应的对象/项目。在我之前给出的示例中,ICraftable 是治疗药水,两根木棍和一杯水都是字典中的一个条目,它是该值的关键。

最后,Craft 方法需要一个字典(换句话说,一个成分列表及其数量),我希望它在 _recipebook 中检查与给定字典对应的项目。如果成分组合有效,则应返回一个项目,否则为 null。

我如何测试这个功能: 我刚开始这个项目,所以我想从单元测试开始。这是设置:

结果:

我正在创建一个名为治疗药水的项目和一本应该是它的食谱的字典。我将这些添加到食谱书中。之后,我正在创建第二个字典来“模拟”用户的输入。该词典的内容与我使用 Add recipe() 添加到食谱书中的内容完全相同。为什么TryGetValue不认为这两个字典是平等的?

我该怎么做才能让它工作?

0 投票
2 回答
111 浏览

c# - 空字典上的 TryGetValue

我正在尝试TryGetValue像往常一样在字典上使用,如下面的代码:

我的问题是字典本身可能是 null。我可以简单地使用“?”。在 UserDefined 之前,但随后我收到错误:

我可以处理这种情况的最佳方法是什么?UserDefined在使用 TryGetValue 之前是否必须检查是否为空?因为如果我不得不使用Response.Context.Skills[MAIN_SKILL].UserDefined两次我的代码可能看起来有点乱: