gpt4 book ai didi

c# - 需要一个允许空键的 IDictionary 实现

转载 作者:可可西里 更新时间:2023-11-01 08:07:17 24 4
gpt4 key购买 nike

基本上,我想要这样的东西:

Dictionary<object, string> dict = new Dictionary<object, string>();
dict.Add(null, "Nothing");
dict.Add(1, "One");

是否有任何内置到基类库中的允许这样做?上述代码在添加空键时会在运行时抛出异常。

最佳答案

您可以避免使用 null 并创建一个特殊的单例值类来做同样的事情。例如:

public sealed class Nothing
{
public static readonly Nothing Value = new Nothing();
private Nothing() {}
}

Dictionary<object, string> dict = new Dictionary<object, string>();
dict.add(Nothing.Value, "Nothing");
dict.add(1, "One");

如果您打算使您的集合具有更强的类型,那么这种方法将无法工作 - 例如您希望键是一个字符串。由于字符串是密封的,因此您不能从它继承来创建一个“特殊值”来替代 null。您的选择变得有点复杂。你可以:

  1. 创建一些特殊的常量值来表示“空”/“空”的情况。有点老套,绝对是一条通往困惑的道路。如果字典对某些实现类来说是完全私有(private)的,那么这可能是一种可行的方法,并且您可以编写一些编码/解码实用方法来避免到处传播有关如何翻译 key 的知识。
  2. 创建您自己的 IDictionary 实现,它在内部委托(delegate)给 Dictionary<> 实例 - 除了 null 的情况。这违反了 IDictionary<> 接口(interface)的记录期望,该接口(interface)确实表示空键应该抛出异常。但是,如果这是解决您实际问题的唯一方法,您也许可以侥幸逃脱。这仅在您拥有并创建字典实例时有效。
  3. 找到一种无需在字典中存储“空”键即可解决问题的方法。例如,考虑不在字典中填充空键并使用一些特殊情况逻辑来处理它。键必须是可散列的并且可以与底层实现进行比较,这就是通常禁止 null 的原因。

顺便说一句,您的字典键真的需要键为 object 吗?由于在您可能希望将 Equals() 评估为比较基础的地方使用引用相等性,这可能会导致细微的错误。

关于c# - 需要一个允许空键的 IDictionary<TKey,TValue> 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1916814/

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