94 votes

Puis-je utiliser un initialiseur de collection pour le Dictionnaire<TKey, TValue=""> entrées?

Je veux utiliser un initialiseur de collection pour le prochain morceau de code:

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

Donc, en général, il devrait être quelque chose comme:

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

Mais quelle est la bonne syntaxe pour cela?

156voto

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

35voto

Anton Gogolev Points 59794

La syntaxe est légèrement différente:

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

Notez que vous êtes effectivement l'ajout de n-uplets de valeurs.

Au passage: initialiseurs de la collection contiennent des arguments qui sont en fait des arguments pour quelle que soit la méthode Add() de la fonction qui est très pratique à l'égard de la compilation type d'argument. C'est, si j'ai une collection:

class FooCollection : IEnumerable
{
    public void Add(int i) ...

    public void Add(string s) ...

    public void Add(double d) ...
}

le code suivant est parfaitement légal:

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

11voto

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

5voto

Simon_Weaver Points 31141

Si vous êtes à la recherche pour un peu moins détaillé de la syntaxe, vous pouvez créer une sous-classe de Dictionary<string, object> (ou quel que soit votre type est) comme ceci :

public class DebugKeyValueDict : Dictionary<string, object>
{

}

Puis il suffit de l'initialiser comme ceci

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

Ce qui est équivalent à

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

L'avantage étant que vous obtenez toutes les compiler le type de choses que vous pourriez vouloir comme être en mesure de dire

is DebugKeyValueDict au lieu de is IDictionary<string, object>

ou de changer le type de la clé ou de la valeur à une date ultérieure. Si vous êtes en train de faire quelque chose comme ceci à l'intérieur d'un rasoir cshtml page, c'est beaucoup plus agréable à regarder.

Ainsi que d'être moins verbeux vous pouvez bien sûr ajouter des méthodes de cette classe pour tout ce que vous voulez.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X