values valor recorrer obtener new ejemplos diccionario c# .net generics collections c#-3.0

valor - recorrer un dictionary c#



¿Puedo usar un inicializador de colección para las entradas de Dictionary<TKey, TValue>? (7)

Quiero usar un inicializador de colección para el siguiente bit de código:

public Dictionary<int, string> GetNames() { Dictionary<int, string> names = new Dictionary<int, string>(); names.Add(1, "Adam"); names.Add(2, "Bart"); names.Add(3, "Charlie"); return names; }

Por lo general, debería ser algo así como:

return new Dictionary<int, string> { 1, "Adam", 2, "Bart" ...

Pero, ¿cuál es la sintaxis correcta para esto?


En el siguiente ejemplo de código, un Dictionary<TKey, TValue> se inicializa con instancias de tipo StudentName .

Dictionary<int, StudentName> students = new Dictionary<int, StudentName>() { { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}}, { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}}, { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}} };

de msdn


La pregunta está etiquetada c#-3.0 , pero, para completar, mencionaré la nueva sintaxis disponible con C # 6 en caso de que esté usando Visual Studio 2015 (o Mono 4.0):

var dictionary = new Dictionary<int, string> { [1] = "Adam", [2] = "Bart", [3] = "Charlie" };

Nota: la sintaxis antigua mencionada en otras respuestas todavía funciona, si te gusta más. Nuevamente, para completar, aquí está la sintaxis antigua:

var dictionary = new Dictionary<int, string> { { 1, "Adam" }, { 2, "Bart" }, { 3, "Charlie" } };

Otro tipo de cosas interesantes a tener en cuenta es que con cualquiera de las sintaxis puede dejar la última coma si lo desea, lo que hace que sea más fácil copiar / pegar líneas adicionales. Por ejemplo, lo siguiente compila muy bien:

var dictionary = new Dictionary<int, string> { [1] = "Adam", [2] = "Bart", [3] = "Charlie", };


La sintaxis es ligeramente diferente:

Dictionary<int, string> names = new Dictionary<int, string>() { { 1, "Adam" }, { 2, "Bart" } }

Tenga en cuenta que efectivamente está agregando tuplas de valores.

Como nota al margen: los inicializadores de colección contienen argumentos que son básicamente argumentos para cualquier función Add () que sea útil con respecto al tipo de argumento en tiempo de compilación. Es decir, si tengo una colección:

class FooCollection : IEnumerable { public void Add(int i) ... public void Add(string s) ... public void Add(double d) ... }

el siguiente código es perfectamente legal:

var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };


Sí, podemos usar el inicializador de colecciones en el diccionario. Si tenemos un diccionario como este,

Dictionary<int,string> dict = new Dictionary<int,string>(); dict.Add(1,"Mohan"); dict.Add(2, "Kishor"); dict.Add(3, "Pankaj"); dict.Add(4, "Jeetu");

Podemos inicializarlo como sigue.

Dictionary<int,string> dict = new Dictionary<int,string> { {1,"Mohan" }, {2,"Kishor" }, {3,"Pankaj" }, {4,"Jeetu" } };


Si busca una sintaxis ligeramente menos detallada, puede crear una subclase de Dictionary<string, object> (o cualquiera que sea su tipo) de esta manera:

public class DebugKeyValueDict : Dictionary<string, object> { }

Entonces solo inicializa así

var debugValues = new DebugKeyValueDict { { "Billing Address", billingAddress }, { "CC Last 4", card.GetLast4Digits() }, { "Response.Success", updateResponse.Success } });

Lo cual es equivalente a

var debugValues = new Dictionary<string, object> { { "Billing Address", billingAddress }, { "CC Last 4", card.GetLast4Digits() }, { "Response.Success", updateResponse.Success } });

El beneficio es que obtienes todo el material de compilación que quieras, como poder decir

is DebugKeyValueDict lugar de is IDictionary<string, object>

o cambiando los tipos de la clave o el valor en una fecha posterior. Si está haciendo algo como esto en una página de razor cshtml es mucho más agradable de ver.

Además de ser menos detallado, puedes agregar métodos extra a esta clase para lo que sea que quieras.


return new Dictionary<int, string> { { 1, "Adam" }, { 2, "Bart" }, ...


var names = new Dictionary<int, string> { { 1, "Adam" }, { 2, "Bart" }, { 3, "Charlie" } };