我目前正在通过以下方式初始化Hashtable:
Hashtable filter = new Hashtable();
filter.Add("building", "A-51");
filter.Add("apartment", "210");
我正在寻找一种更好的方法来做到这一点。
我试过像
这样的东西Hashtable filter2 = new Hashtable() {
{"building", "A-51"},
{"apartment", "210"}
};
但是上面的代码没有编译。
答案 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
这很快就完成了,所以它可能会在某些情况下爆炸但是又会爆炸......