C# Int数组作为字典中的键与字符串

C# Int数组作为字典中的键与字符串,c#,string,dictionary,unity3d,int,C#,String,Dictionary,Unity3d,Int,我现在有一个字典,它使用字符串作为键,使用游戏对象作为值 字符串都是IP地址的,所以它们不是很长。以下是一个例子: string ip = "192.68.137.1" 我知道数字比较比字符串快得多,并且我能够解析数据库服务器中的IP地址 使用整数数组作为字典的键会更快吗?像这样: int[] ip = { 192, 168, 137, 1 } 我定期检查字典是否包含某些值,并定期(通常至少每秒一次)添加到字典中 我之所以对此感到困惑,是因为我使用的字符串(IP地址)总是在该长度附近,所以使

我现在有一个字典,它使用
字符串
作为键,使用
游戏对象
作为值

字符串都是IP地址的,所以它们不是很长。以下是一个例子:

string ip = "192.68.137.1"
我知道数字比较比字符串快得多,并且我能够解析数据库服务器中的IP地址

使用整数数组作为字典的键会更快吗?像这样:

int[] ip = { 192, 168, 137, 1 }
我定期检查字典是否包含某些值,并定期(通常至少每秒一次)添加到字典中

我之所以对此感到困惑,是因为我使用的字符串(IP地址)总是在该长度附近,所以使用整数数组会有任何实际好处吗?如果字典每次必须循环4个数字,我不知道这比字符串比较快多少

和以往一样,您应该测试性能,而不是猜测或让他人猜测。但是,有两件事需要考虑:

  • 您已显示IPv4地址。。。IPv6呢?这肯定会使事情复杂化
  • IPv4地址实际上是4字节。。。那么为什么不把它转换成一个
    uint
    IPAddress
    作为键呢?这样,您就不需要编写自己的
    EqualityComparer
    。很遗憾,
    IPAddress
    没有实现
    IEquatable
    ,但它看起来确实正确地覆盖了
    Equals
    /
    GetHashCode

我会考虑第一点,写一些详细的基准来证明这是多么重要——如果你真的只是每秒只看一次,那就不太重要了——然后尝试各种选择。如果您能够证明有了显著的改进,我只会放弃最简单的代码(如果您已经收到IP地址,那么它将是一个字符串)。

您可以使用IPAdress类作为字典中的关键字。 从字符串创建的示例:
var ipAddressString=“192.68.137.1”
IPAddress address=IPAddress.Parse(ipAddressString)

这是一种更正确的方法

来源:

我可能会使用IPAddress作为密钥。我假设(尽管您可以测试)它将是一个高效的散列搜索,整个v4/v6将由数据类型为您处理。

更好的是,您可以简单地使用int作为键。IP基本上是一个4字节的列表(几乎是一个整数)。例如,“192.68.137.1”相当于0xc0a88901。IP地址可以放入一个Int32:)如何将这些字符串或数组转换为一个int?挑剔:
int[]IP=[192168,137,1]
无效。应该是
int[]ip={192168,137,1}
(即花括号),因为这是每隔一秒做一次,这应该不是问题。我的第一个问题也是“IPv6有不同的格式如何?”非常感谢,这对我也很有帮助。