Есть ли лучший способ инициализировать Hastable в .NET без использования метода Add?
В настоящее время я инициализирую Hashtable следующим образом:
Hashtable filter = new Hashtable();
filter.Add("building", "A-51");
filter.Add("apartment", "210");
Я ищу более удобный способ сделать это.
Я пробовал что-то вроде
Hashtable filter2 = new Hashtable() {
{"building", "A-51"},
{"apartment", "210"}
};
Однако приведенный выше код не компилируется.
Ответы
Ответ 1
Точный код, который вы опубликовали:
Hashtable filter2 = new Hashtable()
{
{"building", "A-51"},
{"apartment", "210"}
};
Скомпилируется в С# 3. Учитывая, что вы сообщали о проблемах с компиляцией, я предполагаю, что вы используете С# 2? В этом случае вы можете хотя бы сделать это:
Hashtable filter2 = new Hashtable();
filter2["building"] = "A-51";
filter2["apartment"] = "210";
Ответ 2
В С# 3 он должен компилироваться так:
Hashtable table = new Hashtable {{1, 1}, {2, 2}};
Ответ 3
(Не эксперт на С#)
Это синтаксический сахар, и если это синтаксический сахар, я бы хотел, чтобы сопоставление (в Hashtable) было приятным и очевидным:
Hashtable filter2 = new Hashtable() { "building" => "A-51", "apartment" => "210"};
Однако я не вижу реальной потребности в этом, нет ничего плохого в том, что нужно просто вызвать add после инициализации.
(Я знал, что люди разбираются с компилятором Java для достижения аналогичных вещей в прошлом для Java (что вызвало серьезные проблемы с переходом на Java 5 через несколько лет), я ожидаю, что это не вариант для С# хотя!)
Ответ 4
Я думаю, что реальный вопрос, который задают, может касаться мыслимых конструкторов, таких как:
HashTable ht = новый HashTable (MyArray);//заполнять из массива
HashTable ht = новый HashTable (MyDataTable);//заполнять из datatable
AFAIK, ответ "нет", но вы можете написать его сами. Я предполагаю, что причина, по которой такие методы не находятся в библиотеке, заключается в том, что Array или DataTable должны быть правильно сформированы. Это не такая большая потеря, поскольку любая реализация этих методов, вероятно, будет использовать метод Add в цикле в любом случае.
Ответ 5
Я понятия не имел, что в С# 3.0 Hashtable table = new Hashtable {{1, 1}, {2, 2}};
будет компилироваться.
В любом случае, реализация бедного человека:
Meh, вы можете расширить класс 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 Друиды
это было сделано быстро, чтобы оно могло бомбить в определенных ситуациях, но затем снова.