Je souhaite utiliser un initialiseur de collection pour le prochain bit 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, 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?
Réponses:
la source
Dictionary<TKey, TValue>
sous-classes ou fonctionnera égalementICollection<KeyValuePair<TKey, TValue>>
?var
place du type de déclaration, ou si vous quittez le type de déclaration, vous pouvez omettre lenew Dictio...
- stackoverflow.com/questions/5678216/…var
vous évite littéralement les frappes au clavier, il est implicitement fortement typé .var
et se répéter avecSomeType obj = new SomeType...
. Et comme vous ne pouvez pas déclarervar obj;
sans initialiser immédiatement, je ne vois tout simplement pas le problème. Vraiment, j'essaie d'apprendre, mais je ne peux pas changer votre position.La syntaxe est légèrement différente:
Notez que vous ajoutez effectivement des tuples de valeurs.
En remarque: les initialiseurs de collection contiennent des arguments qui sont essentiellement des arguments de la fonction Add () utile en ce qui concerne le type d'argument au moment de la compilation. Autrement dit, si j'ai une collection:
le code suivant est parfaitement légal:
la source
IEnumerable
et a desAdd()
méthodes.Add
.IEnumerable<T>
et qui a uneAdd
méthode. Si laAdd
méthode prend 3 paramètres, vous aurez besoin de 3 objets entre parenthèses.la source
La question est balisée
c#-3.0
, mais par souci d'exhaustivité, je mentionnerai la nouvelle syntaxe disponible avec C # 6 au cas où vous utiliseriez Visual Studio 2015 (ou Mono 4.0):Remarque: l'ancienne syntaxe mentionnée dans d'autres réponses fonctionne toujours si vous aimez mieux cela. Encore une fois, pour être complet, voici l'ancienne syntaxe:
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:
la source
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:Ensuite, initialisez simplement comme ça
Ce qui équivaut à
L'avantage étant que vous obtenez tous les éléments de type de compilation que vous pourriez souhaiter, comme pouvoir dire
is DebugKeyValueDict
au lieu deis IDictionary<string, object>
ou en modifiant les types de la clé ou de la 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.
la source
Dans l'exemple de code suivant, a
Dictionary<TKey, TValue>
est initialisé avec des instances de typeStudentName
.depuis msdn
la source
Oui, nous pouvons utiliser l'initialiseur de collection dans le dictionnaire.Si nous avons un dictionnaire comme celui-ci -
Nous pouvons l'initialiser comme suit.
la source