¿Qué beneficios añaden los inicializadores de diccionario sobre los inicializadores de colección?


En un pasado reciente se ha hablado mucho de lo nuevo en C# 6.0
Una de las características más comentadas es el uso de inicializadores Dictionary en C# 6.0
Pero espera, hemos estado usando inicializadores de colecciones para inicializar las colecciones y podemos muy bien inicializar un Dictionary también en. NET 4.0 y. NET 4.5 (No sé acerca de la versión anterior) como

Dictionary<int, string> myDict = new Dictionary<int, string>() {
    { 1,"Pankaj"},
    { 2,"Pankaj"},
    { 3,"Pankaj"}
};

Entonces, ¿qué hay de nuevo en C# 6.0, De qué Inicializador de diccionario están hablando en C# 6.0

Author: rsenna, 2014-12-02

2 answers

Mientras que podría inicializar un diccionario con inicializadores de colección, es bastante engorroso. Especialmente para algo que se supone que es azúcar sintáctica.

Los inicializadores de diccionario son mucho más limpios:

var myDict = new Dictionary<int, string>
{
    [1] = "Pankaj",
    [2] = "Pankaj",
    [3] = "Pankaj"
};

Más importante aún, estos inicializadores no son solo para diccionarios, se pueden usar para cualquier objeto que soporte un indexador , por ejemplo List<T>:

var array = new[] { 1, 2, 3 };
var list = new List<int>(array) { [1] = 5 };
foreach (var item in list)
{
    Console.WriteLine(item);
}

Salida:

1
5
3
 74
Author: i3arnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 09:42:18

Nuevo es crear un diccionario de esta manera

Dictionary<int, string> myDict = new Dictionary<int, string>() {
    [1] = "Pankaj",
    [2] = "Pankaj",
    [3] = "Pankaj"
};

Con el estilo de <index> = <value>

Obsoleto: sintaxis de miembros indexados de cadenas (como se indica en los comentarios)

Dictionary<int, string> myDict = new Dictionary<int, string>() {
        $1 = "Pankaj",
        $2 = "Pankaj",
        $3 = "Pankaj"
    };

Tomado de Una Vista previa del lenguaje C # 6.0

Para entender el operador$, eche un vistazo a la llamada a la función AreEqual. Observe la invocación del miembro del Diccionario de "Bo Boolean "en la variable builtInDataTypes-aunque no hay ningún miembro" Booleano " en el Diccionario. Tal explicito member no es necesario porque el operador invo invoca al miembro indexado en el diccionario, el equivalente de llamar a buildInDataTypes ["Boolean"].

 0
Author: Jehof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-02 09:27:09