uso una tipo que parametrizado new metodos locales las instanciar instancia inicializar implícito diccionarios deben crear con como clases clase c#

c# - tipo - ¿Hay una mejor manera de inicializar una Hastable en.NET sin usar el método Add?



que es una instancia en c# (5)

Actualmente estoy inicializando una Hashtable de la siguiente manera:

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

Estoy buscando una manera más agradable de hacer esto.

Intenté algo así como

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

Sin embargo, el código anterior no se compila.


(No es un experto en C #)

Este es el azúcar sintáctico, y si se trata de azúcar sintáctica, me gustaría que el mapeo (en una Hashtable) fuera agradable y obvio:

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

Sin embargo, no veo una necesidad real de esto, no hay mucho problema con solo llamar a agregar después de la inicialización.

(He sabido que la gente hackear el compilador de Java para lograr cosas similares en el pasado para Java (lo que provocó que algunos problemas principales se trasladaran a Java 5 algunos años después), ¡aunque espero que esto no sea una opción para C #!)


Creo que la verdadera pregunta es acerca de constructores imaginables como:

HashTable ht = new HashTable (MyArray); // fill from array

HashTable ht = new HashTable (MyDataTable); // relleno de tabla de datos

AFAIK, la respuesta es "no", pero podrías escribirlo tú mismo. Supongo que la razón por la que dichos métodos no están en la biblioteca es porque la matriz o la tabla de datos deben formarse correctamente. No es una pérdida tan grande ya que cualquier implementación de estos métodos probablemente usaría el método Add en un bucle de todos modos.


El código exacto que publicaste:

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

Compila perfectamente en C # 3. Dado que informaste problemas de compilación, supongo que estás usando C # 2? En este caso, al menos puedes hacer esto:

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


No tenía idea en C # 3.0 Hashtable table = new Hashtable {{1, 1}, {2, 2}}; compilaría

De todos modos, la implementación del pobre hombre:

Meh, podrías extender la clase 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]); } } }

Y luego desde una aplicación de consola:

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(); } }

resultará en:
A-51
210
Druidas Nerf

esto se hizo rápido para que pueda bombardear en ciertas situaciones, pero de nuevo ...


En C # 3 debería compilarse bien así:

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