gpt4 book ai didi

c# - 为对象派生唯一字典键的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 13:57:44 28 4
gpt4 key购买 nike

问题

我需要一种为对象字典生成键的方法。但是,我有一些要求使这有点困难。这是场景:

  1. 字典是引用类型对象的列表。
  2. 字典是私有(private)的,在静态类中。
  3. 外部代码需要获取字典中特定对象的键,但不得访问字典中的对象或字典本身。
  4. 给定字典中的特定对象,键必须始终可重新计算/派生。如果对象的属性发生变化,则 key 不得更改。
  5. 相反,如果创建的新对象可以评估为与字典中的另一个对象相等,则键必须不同,因为它们是两个独立的对象。
  6. 此实现必须是线程安全的。

非解决方案

解决方案#1
所有 .Net 对象都包含一个名为 .GetHashCode() 的方法,该方法返回一个整数值。您可以将其用作 key 。

问题
不可能。 MSDN 声明:

Two objects that are equal return hash codes that are equal.

这打破了请求 #5,我假设(但未测试)请求。 #4。如果它能满足这些规则,我很乐意拥有这样的选项。

解决方案#2
将指向对象的指针转换为 int 并将其用作键。

问题
这打破了req的本质。 #3。传递指针并将它们用作键并不安全。

解决方案#3
将指向对象的指针转换为整数散列值并将散列用作键。

问题
虽然这没有违反任何规则,但我宁愿避免访问指针,因为这将涉及使用 unsafe 代码。我不反对在必要时使用不安全的代码,但我宁愿尽可能避免使用它。

结论

也许我的要求有点挑剔。必须有一些合理的方法从唯一对象派生 key 。有没有人经历过这样的场景并解决了这个困境?

最佳答案

1 The Dictionary is a list of ByRef objects.

对象在 .NET 中总是“通过引用”。这可能是误会的开始。引用平等是你需要/想要的。

3 External code needs to obtain a key to specific objects within the dictionary, but MUST NOT have access to the objects within the dictionary, or the dictionary itself.

这才是真正的问题。没有它,对对象本身的引用就可以工作。但是该框架仍然提供所有现成的功能:

private Dictionary<object, MyClass> _myStore;

// add an item and return a key
public object Add(MyClass item)
{
object key = new object();
_myStore.Add(key, item);
return key;
}

并满足要求#4:

private Dictionary<object, MyClass> _itemForKey;    // was _myStore
private Dictionary<MyClass, object> _keyForItem;


// add an item and return a key
public object Add(MyClass item)
{
object key = new object();
_itemForKey.Add(key, item);
_keyForItem.Add(item, key);
return key;
}

protected object DeriveKeyFromItem(MyClass item)
{
return _keyForItem[item];
}

注意:这些示例不是线程安全的(要求 6),但这是要解决的标准功能。

关于c# - 为对象派生唯一字典键的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19844257/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com