Chaîne de caractères.Format: chaîne d'Entrée n'était pas dans un format correct

Le code suivant donnez-moi de l'erreur en disant: chaîne d'Entrée n'était pas dans un format correct, mais je suis assez sûr qu'il est juste, n'est-ce pas?

int id = 112;

String[] newData = { "1", "2", "21", "reidb", "reidb", "reidb", "reidb", "aa", 
                      "Some description", "11", "2012-02-28", "2012-01-29", "true", "1", "1", 
                      "true", "note note note", "true", "1", "2011-12-03", "45"};

String data = "{ cmd: \"save magellan deal\", data: { id: {0} , AId: {1}, " +
            "CId: {2}, CCId:{3}, LA: \"{4}\", BA: \"{5}\" , " +
            "LSA: \"{6}\" , BSA: \"{7}\" , \"path: \"{8}\"," +
            "dscp: \"{9}\", SI: \"{10}\", CD: \"{11}\", " +
            "period: \"{12}\", IsStatic: {13}, LSD: {14}, LC: {15}, RB: {16},} " +
            "Notes: \"{17}\", IsEE: {18}, RBy: {19}, DPDD: \"{20}\", LId: {21} } }";


String cmd = String.Format(data, id.toString(), newData);

Personne des idées?

=== EDIT ===

après la fixation de l'appareil dentaire, une nouvelle erreur de "l'Index (de base zéro) doit être supérieur ou égal à zéro et inférieur à la taille de la liste d'arguments." est donné. le newData a 21 ans et plus de l'id.toString(), doit être exacte 22?

  • Vous devez vous échapper d'accolades. L'utilisation de deux pour les données json '{{'.
  • quel est votre format..? rechercher sur la façon d'utiliser des chaînes de caractères.Format
  • personnellement, je ne voudrais pas utiliser string.Format pour ce tout - c'est juste en ajoutant de la complexité pour aucune bonne raison. Il n'y a aucun moyen que vous pouvez savoir rapidement quel argument va à laquelle l'espace réservé. la concaténation de chaîne a la même sémantique, ne peut échapper règles à retenir, et il est même légèrement plus rapide - et puis, vous pouvez réellement voir le contexte des variables de l'insertion, qui, je suppose avoir une signification dans le programme réel.
  • Je suis d'accord sur la complexité, mais en désaccord à propos de la vitesse. Les chaînes sont immuables en C#, donc faire des concaténations de chaînes multiples, comme dans ce cas est susceptible d'être plus lente. Cependant, la différence de performances n'est pas susceptible d'affaire pour la plupart des cas d'utilisation donc je serais favorable à une meilleure, plus facile à gérer le code sur la Chaîne.Format.
  • C'est assez horrible de code. Avez-vous au moins considérée comme un véritable sérialiseur json?
  • J. de la chaîne peut être immuable, mais derrière les coulisses de la chaîne.Le Format de construire une nouvelle chaîne de caractères par concaténation. En outre, il doit analyser la chaîne de format - quelque chose qui n'est pas gratuit; il s'agit fort probablement de la partie la plus coûteuse de l'ensemble de l'opération. En revanche, un tas de inline chaîne-concaténations sont optimisés par le compilateur C# pour juste un concat appel, c'est à dire un peu plus rapide que string.Join ou StringBuilder. Donc il n'y a pas de raison technique pour l'éviter; et votre code sera plus lisible pour elle.
  • Je n'ai même pas voir la ressemblance avec le JSON dans un premier temps! Vous avez raison, il faut juste utiliser les Json.NET s'il essaie de faire un script javascript littérale. Il ne fait pas (valide) JSON de toute façon, étant donné que les grands noms ne sont pas cités, et les navigateurs modernes va s'étouffer sur qu' (donc c'est probablement un js littérale).
  • Chaîne de caractères.Format utilise un StringBuilder.AppendFormat interne de la reflector.webtropy.com/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/... qui alloue un tampon et remplit le tampon. Il ne fait pas de concaténation de chaîne pour chaque argument. reflector.webtropy.com/default.aspx/4@0/4@0/DEVDIV_TFS/Dev10/...
  • la chaîne de la construction en ce que la mode est la concaténation de chaîne. Je suis désolé, je n'ai pas été clair: je ne veux pas dire qu'il utilise la méthode de la chaîne.Concat. Je voulais dire que c'est le formatage de la chaîne par la concaténation d'un tas de petites chaînes. Pour être clair: ce n'est pas invalider la unreadableness que string.Format souvent les causes, ni les pauvres vérification de type, ni le fait que la chaîne de caractères.Le Format est un peu plus lent. Certes, la différence de performances n'est pas assez grand à la matière -, mais sa certainement pas une raison de préférer la chaîne.Format soit.