web-dev-qa-db-fra.com

Puis-je utiliser un initialiseur de collection pour les entrées du dictionnaire <TKey, TValue>?

Je veux utiliser un initialiseur de collection pour le bit de code suivant:

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, généralement, cela devrait être quelque chose comme:

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

Mais quelle est la syntaxe correcte pour cela?

94
Gerrie Schenck
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};
156
bruno conde

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

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

Notez que vous ajoutez effectivement des tuples de valeurs.

En tant que sidenote: les initialiseurs de collection contiennent des arguments qui sont essentiellement des arguments pour la fonction Add () qui est utile en ce qui concerne le type d'argument au moment de la compilation. Autrement dit, 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!" };
35
Anton Gogolev
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...
11
ybo

La question est balisée c#-3.0, mais pour être complet, je mentionnerai la nouvelle syntaxe disponible avec C # 6 au cas où vous utilisez Visual Studio 2015 (ou Mono 4.0):

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

Remarque: l'ancienne syntaxe mentionnée dans d'autres réponses fonctionne toujours, si vous préférez cela. Encore une fois, pour être complet, voici l'ancienne syntaxe:

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

Une autre chose intéressante à noter est qu'avec l'une ou l'autre syntaxe, vous pouvez laisser la dernière virgule si vous le souhaitez, ce qui facilite le copier/coller de lignes supplémentaires. Par exemple, ce qui suit se compile très bien:

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

Si vous recherchez une syntaxe légèrement moins verbeuse, vous pouvez créer une sous-classe de Dictionary<string, object> (ou quel que soit votre type) comme ceci:

public class DebugKeyValueDict : Dictionary<string, object>
{

}

Ensuite, initialisez simplement comme ceci

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

Ce qui équivaut à

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

L'avantage étant que vous obtenez tous les trucs de type de compilation que vous voudrez peut-être, comme pouvoir dire

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

ou modifier les types de clé ou de valeur à une date ultérieure. Si vous faites quelque chose comme ça dans une page cshtml de rasoir, c'est beaucoup plus agréable à regarder.

En plus d'être moins verbeux, vous pouvez bien sûr ajouter des méthodes supplémentaires à cette classe pour tout ce que vous voudrez.

5
Simon_Weaver

Dans l'exemple de code suivant, un Dictionary<TKey, TValue> est initialisé avec des instances de type 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

1
Bellash