是否有更好的方法在不使用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德鲁伊
此操作很快完成,因此在某些情况下可能会炸毁,但随后又会炸毁。