有没有更好的方法在不使用Add方法的情况下初始化.NET中的Hashtable?

时间:2008-09-24 16:55:46

标签: c#

我目前正在通过以下方式初始化Hashtable:

Hashtable filter = new Hashtable();
filter.Add("building", "A-51");
filter.Add("apartment", "210");

我正在寻找一种更好的方法来做到这一点。

我试过像

这样的东西
Hashtable filter2 = new Hashtable() {
    {"building", "A-51"},
    {"apartment", "210"}
};

但是上面的代码没有编译。

5 个答案:

答案 0 :(得分:31)

您发布的确切代码:

        Hashtable filter2 = new Hashtable()
        {
            {"building", "A-51"},
            {"apartment", "210"}
        };

在C#3中完美编译。鉴于您报告编译问题,我猜您正在使用C#2?在这种情况下,您至少可以这样做:

        Hashtable filter2 = new Hashtable();
        filter2["building"] = "A-51";
        filter2["apartment"] = "210";

答案 1 :(得分:9)

在C#3中它应该编译得很好:

Hashtable table = new Hashtable {{1, 1}, {2, 2}};

答案 2 :(得分:0)

(不是C#专家)

这是语法糖,如果它是语法糖,我想让映射(在Hashtable中)很好而且显而易见:


Hashtable filter2 = new Hashtable() { "building" => "A-51", "apartment" => "210"};

但是我没有看到真正的需要,只需在初始化后调用add就没有太大的错误了。

(我已经知道人们用Java编译器来破解Java过去的类似事情(几年后导致重大问题转移到Java 5),我希望这不是C#的一个选项虽然!)

答案 3 :(得分:0)

我认为被问到的真正问题可能是关于可以想象的构造函数,例如:

HashTable ht = new HashTable(MyArray); //从数组填充

HashTable ht = new HashTable(MyDataTable); //从数据表填充

AFAIK,答案是“不”,但你可以自己写。我假设这些方法不在库中的原因是必须正确形成Array或DataTable。这不是一个很大的损失,因为这些方法的任何实现都可能在循环中使用Add方法。

答案 4 :(得分:0)

我不知道在C#3.0 Hashtable table = new Hashtable {{1, 1}, {2, 2}};会编译。

无论如何,穷人的实施:

嗯,你可以扩展Hashtable类:

class MyHashTable : System.Collections.Hashtable    
{
    public MyHashTable(string [,] values)
    {
        for (int i = 0; i < (values.Length)/2; i++)
        {
            this.Add(values[i,0], values[i,1]);
        }
    }
}

然后从控制台应用程序:

    class Program
{
    static void Main(string[] args)
    {
        string[,] initialize = { { "building", "A-51" }, { "apartment", "210" }, {"wow", "nerf Druids"}};



        MyHashTable myhashTable = new MyHashTable(initialize);
        Console.WriteLine(myhashTable["building"].ToString());
        Console.WriteLine(myhashTable["apartment"].ToString());
        Console.WriteLine(myhashTable["wow"].ToString());
        Console.ReadKey();


    }
}

将导致:
A-51
210个
nerf Druids

这很快就完成了,所以它可能会在某些情况下爆炸但是又会爆炸......