2008-09-24 11 views
16

Actualmente estoy inicialización de una tabla hash de la siguiente manera:¿Hay una mejor manera de inicializar una Hastable en .NET sin usar el método Add?

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

Busco una manera más agradable de hacer esto.

he intentado algo así como

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

Sin embargo, el código no compila.

Respuesta

25

El código exacto que publicado:

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

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

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

En C# 3 debería compilarse bien como esto:

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

Para los inicializadores de objetos, los pares de Constructor son opcionales? –

+0

si tiene un ctor vacío, ya – mattlant

0

(No es un C# experto)

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

 

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

sin embargo, no veo una necesidad real de esto, no hay mucho malo con sólo tener que llamar a añadir después de la inicialización.

(He conocido a personas que hackearon el compilador de Java para lograr cosas similares en el pasado para Java (lo que ocasionó que algunos problemas principales pasen a Java 5 algunos años después), espero que esta no sea una opción para C# aunque)

+0

Hay una necesidad si necesita agregarlo en línea: someclass.AddTable (nueva HashTable {{1, "A"}, {2, "b"}}); – mattlant

0

creo que la verdadera pregunta que se le preguntó sobre los constructores pueden ser imaginables, tales como:

HashTable ht = new Hashtable (MiMatriz); // fill from array

HashTable ht = new HashTable (MyDataTable); // fill from datatable

AFAIK, la respuesta es "no", pero puede escribirla usted 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.

+0

Iniciales de objetos como el póster publicado forma parte de la especificación de lenguaje C# 3. El compilador toma el código y lo compila en Agregar llamadas. Prácticamente cualquier clase que tenga un método add (implementando IEnumerable) se puede inicializar de esta manera. – mattlant

0

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 hombre pobre: ​​

Meh, que podría 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 después de 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(); 


    } 
} 

se traducirá en:
A-51
nerf Druids

esto se hizo rápido por lo que puede bombardear en ciertas situaciones, pero de nuevo ..

+0

tal vez objeto [,]? porque puede usar cualquier objeto (inmutable) como clave Hashtable, no solo como cadenas. Y, por cierto, drus han visto bastante nerfing :) Mages también;) (descargo de responsabilidad: no tan infeliz mago :)) –

Cuestiones relacionadas