Подтвердить что ты не робот

Есть ли лучший способ инициализировать 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"}
};

Однако приведенный выше код не компилируется.

4b9b3361

Ответ 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 Друиды

это было сделано быстро, чтобы оно могло бомбить в определенных ситуациях, но затем снова.