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

时间:2020-03-06 14:40:28  来源:igfitidea点击:

我目前正在通过以下方式初始化哈希表:

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

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

我尝试了类似的东西

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

但是,以上代码无法编译。

解决方案

在C3中,应这样编译:

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

(不是专家)

这是语法糖,如果是语法糖,我希望映射(在Hashtable中)很好且很明显:

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

但是我没有真正的需要,初始化后只需要调用add就没有多大的错。

(我知道人们过去经常使用Java编译器来实现Java的类似功能(几年后导致重大问题转移到Java 5),我希望Cthough不能选择它!

我们发布的确切代码:

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

在C3中完美编译。鉴于我们报告了编译问题,我猜我们正在使用C2?在这种情况下,我们至少可以执行以下操作:

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

我认为要问的真正问题可能与可想象的构造函数有关,例如:

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

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

AFAIK,答案是"否",但我们可以自己编写。我认为此类方法不在库中的原因是必须正确形成Array或者DataTable。损失不算太大,因为这些方法的任何实现都可能在循环中使用Add方法。

在C3.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德鲁伊

此操作很快完成,因此在某些情况下可能会炸毁,但随后又会炸毁。