Agregar valores a un diccionario a través de la inicialización en línea de su contenedor

Tengo lo siguiente City clase. Cada objeto de ciudad contiene un diccionario cuyas claves son etiquetas de idioma (digamos: "EN", "DE", "FR"...) y cuyos valores son los nombres de las ciudades en los idiomas correspondientes (por ejemplo, Roma / Rom, etc.) .

public class City:
{
  private IDictionary<string, string> localizedNames = new Dictionary<string, string>(0);
  public virtual IDictionary<string, string> Names
  {
    get { return localizedNames ; }
    set { localizedNames = value; }
  }
}

La mayoría de las ciudades tienen los mismos nombres sea cual sea el idioma por lo que la City constructor realmente crea el mapeo en inglés:

  public City(string cityName)
  {
    this.LocalizedNames.Add("EN", cityName);
  }

Aquí viene la pregunta: ¿hay alguna manera de agregar los otros valores a través de la inicialización en línea?

Probé diferentes variaciones de lo siguiente sin éxito semántico (no se compila):

AllCities.Add(new City("Rome") { Names["DE"] = "Rom" };

También intenté crear un nuevo Diccionario, pero esto obviamente sobrescribe el parámetro "EN":

AllCities.Add(new City("Rome") { Names = new Dictionary<string, string>() { { "DE", "Rom" } } };

¿Alguien sabe si esto es posible?

preguntado el 12 de junio de 12 a las 15:06

Nota: inicialización del constructor no es la terminología apropiada. Pensar objeto y -- inicialización, ninguna de las cuales se realiza a través de un constructor. -

tienes razón, edité el título, gracias -

3 Respuestas

esta es la inicialización en línea real:

private IDictionary<string, string> localizedNames = new Dictionary<string, string>{
    {"key1","value1"},
    {"key2","value2"}
};

respondido 10 mar '17, 23:03

AllCities.Add(new City("Rome") { Names = { { "DE", "Rom" }, { "...", "..." } } });

Esto usa la sintaxis del inicializador para invocar el método .Add.

Respondido 27 Feb 15, 19:02

Esto sobrescribirá el valor agregado en el constructor, tal como lo hará el último bloque de código proporcionado por el autor de la pregunta. - Rawling

No, no lo hará. Se agregará al diccionario existente. No creará uno nuevo. - usr

... Me entendiste, no lo intenté. Dame un segundo. Si tienes razón, humildemente me disculparé. - Rawling

(Y esa es una extraña sinax inicializadora allí. Aprendes algo nuevo todos los días). - Rawling

Maldita sea, estoy bastante seguro de que eso no es lo primero que probé... funciona de hecho. ¡Muchas gracias! - Timothée Bourguignon

Hay un mejor enfoque para esto que usar objetos anónimos:

IDictionary<string, string> dict = new Dictionary<string, string>
{
    ["key1"] = "value1",
    ["key2"] = "value2",
    ["key3"] = "value",
};

EDITAR: En cuanto a la solicitud de OP para una explicación

Desde Inicializadores de objetos y colecciones (Guía de programación de C #) Object and Collection Initializers (C # Programming Guide):

var numbers = new Dictionary<int, string>
{
    [7] = "seven",
    [9] = "nine",
    [13] = "thirteen"
};

El ejemplo anterior genera código que llama al Artículo[TKey] para establecer los valores. Antes de C# 6, podía inicializar diccionarios y otros contenedores asociativos con la siguiente sintaxis. Tenga en cuenta que en lugar de la sintaxis del indexador, con paréntesis y una asignación, utiliza un objeto con varios valores:

var moreNumbers = new Dictionary<int, string>
{
    {19, "nineteen" },
    {23, "twenty-three" },
    {42, "forty-two" }
};

Este ejemplo de inicializador llama Agregar (clave T, valor de TV) para agregar los tres elementos en el diccionario. Estas dos formas diferentes de inicializar colecciones asociativas tienen un comportamiento ligeramente diferente debido a las llamadas a métodos que genera el compilador. Ambas variantes funcionan con el Dictionary clase. Es posible que otros tipos solo admitan uno u otro en función de su API pública.


Para mí, es solo una cuestión de legibilidad. Creo que es mucho más fácil leer y comprender lo que se hace porque también puedes recuperar los valores con el [] soportes. Sin embargo, no sé nada sobre el rendimiento, pero supongo que la primera forma también sería la mejor opción.

Respondido 04 ago 21, 08:08

Gracias por tu respuesta. Dado que la pregunta es de 2012, agregaría que la forma de indexación que sugiere se introdujo en C # 6.0. ¿Y podrías explicar por qué crees que es mejor? - Timothée Bourguignon

@TimothéeBourguignon Agregué la explicación. Espero que esto ayude. - Speyck

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.