声明具有键、值的哈希表

本文关键字:哈希表 声明 | 更新日期: 2023-09-27 18:02:59

我在C# 2.0中。

我想知道是否可以声明一个用键和值启动的Hashtable const。我知道数组是可能的:

public  static string[] ColumnsNames = 
{ "string1", "string2", "string3", "string4"
, "string5", "string6", "string7" };

但是我们如何用哈希表做到这一点。

声明具有键、值的哈希表

这在 C# 2.0 中无法完成。该语言不支持它。语言规范在这里,没有提到内联字典初始化。

C# 3.0 确实允许字典初始化,类似于您在问题中描述的数组初始化(此处为语言规范(。下面是一个示例:

var dictionary = new Dictionary<string, string> {
    {"key1", "value1"},
    {"key2", "value2"}
}; 

相信这应该有效。

public Hashtable hash = new Hashtable()
{
  { "string1", 1 },
  { "string2", 2 }
}

使用 C# 3 集合初始值设定项创建静态只读字段很容易,该字段仍可面向 .NET 2。不过,使用 Dictionary<string, string> 而不是 Hashtable(除非真的必须1,否则不要使用非泛型集合(。

这不是你可以用const声明的编译时常量,但我希望你不是真的const之后。

private static readonly Dictionary<string, string> Foo
    = new Dictionary<string, string>
{
    { "Foo", "Bar" },
    { "Key", "Value" },
    { "Something", "Else" }
};

C# 2 中没有类似的东西,如果你真的必须使用它的话。你真的还在使用 Visual Studio 2005 吗?不要忘记,您仍然可以使用 C# 3 和 4 以 .NET 2 为目标...

编辑:如果你真的想用C# 2和哈希表来做,你可以写一个静态方法,像这样:

public static Hashtable CreateHashtable(params object[] keysAndValues)
{
    if ((keysAndValues.Length % 2) != 0)
    {
        throw new ArgumentException("Must have an even number of keys/values");
    }
    Hashtable ret = new Hashtable();
    for (int i = 0; i < keysAndValues.Length; i += 2)
    {
        ret[keysAndValues[i]] = keysAndValues[i + 1];
    }
    return ret;
}

然后:

private static readonly Hashtable Foo = HashtableHelper.CreateHashtable(
    "key1", "value1", "key2", 10, "key3", 50);

不过我真的不建议这样做...

<小时 />

1 如果您使用的是 C# 3,则相同的语法适用于Hashtable,但如果可能的话,使用泛型集合确实非常值得。

你的意思

Dictionary<string, string> DDD = new Dictionary<string, string> { { "A", "B" }, { "X", "Y" }, { "Z", "A" } };

您应该使用 Dictionary .平均而言,Hastable字典慢约1/3(主要是由于实现(。此外,它已经过时了。