【问题标题】:Is there any character limitation in Dictionary Keys?字典键中有字符限制吗?
【发布时间】:2010-10-26 20:01:01
【问题描述】:

在 .NET 中,我可以使用任何字符串作为字典键吗?这是模板引擎的一部分,我计划允许用户添加他们的自定义标题和值。

标题将类似于“X 值”或“分析和 XYZ 报告摘要”,我担心它们是否会在罕见字符或类似字符中出现异常。

我假设有大小限制,但希望它大于 256 个字符。 MSDN 没有关于该主题的任何详细信息。

【问题讨论】:

    标签: c# .net dictionary key key-value


    【解决方案1】:

    是的,它可以使用任何有效的字符串(限制为几十亿字节)。

    顺便说一句,您可能会传递一个自定义 IEqualityComparer<T>,您可能会将其传递给可能需要最大限制的 Dictionary 构造函数。

    【讨论】:

    • 学究起来,它更接近 1,073,741,823(字符串开销为 -20)
    • 确保使用正确的比较器。 StringComparer,在 System 命名空间中,有一些具有不同比较器的静态属性。
    【解决方案2】:

    由于密钥只是一个 .NET 字符串,请参阅这个相关的 SO 问题:What is the maximum possible length of a .NET string?

    【讨论】:

      【解决方案3】:

      字典没有任何关于用作其键和值的类型的特殊知识。无论对象类型如何,它都会简单地调用GetHashCodeEquals 方法以允许它把值放入正确的存储桶中并再次检索它。这意味着任何正确实现这些方法的类都可以作为key。

      string 类确实根据它的值正确实现了这些方法,所以只要你可以构造字符串的实例,那么你就可以将它用作键。

      【讨论】:

      • 如果没有指定其他比较器,Dictionary(of T,U) 的构造函数将检查类型 T 是否实现 iEquatable(of T)。如果是这样,键将使用 iEquatable(of T).Equals 而不是 Object.Equals 进行比较。一般来说,这不会失败,但是如果一个可继承类实现了 iEquatable(of itsType),那么任何从它派生的具有不同比较语义的类都必须重新实现 iEquatable(of theEarlierType),否则可能会出现错误结果。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-06
      • 2022-08-12
      • 1970-01-01
      • 2018-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多