2009-10-06 6 views
1

Par exemple:Quelle est l'utilisation la plus lisible de String.Format pour les chaînes longues avec de nombreux paramètres?

String login = String.Format("computer={0}&ver={1}.{2}.{3}&from={4}&realcomputername={5}&type={6}&Channels={7}&Hotkeys={8}&ID={9}\r\n", 
      serviceConfig.Computer, 
      serviceConfig.Version.Major, 
      serviceConfig.Version.Minor, 
      serviceConfig.Version.Build, 
      userName, 
      Environment.MachineName, 
      type, 
      serviceConfig.ChannelsString, 
      serviceConfig.HotKeysString, 
      serviceConfig.AlarmGroupName); 

Cela ne fait pas pour le code très lisible, et que de plus en plus de paramètres sont ajoutés, il semble plus laid et est plus difficile à trouver quel paramètre va dans quel emplacement. Je sais que c'est une question de noob, et je pense que je demande seulement comment formater le texte pour qu'il soit plus lisible, mais s'il y a une meilleure façon de le faire, j'aimerais le savoir aussi.

+2

Voir aussi: http://stackoverflow.com/questions/1322037/how-can--create-a-more-user-friendly-string-format-syntax/1322103#1322103 –

+0

Aussi http: // stackoverflow .com/questions/1010123/named-string-format-is-it-possible-c –

Répondre

7

Vous pouvez regarder le StringBuilder class et diviser l'assemblage de la chaîne sur plusieurs lignes. Le AppendFormat method (merci Joel) est ce que vous voulez dans ce cas.

+0

D'autant que les appels String.Format() créent un StringBuilder et appellent quand même la méthode AppendFormat() en arrière-plan. –

1
String login = String.Format(
    "computer={0}"+ 
    "&ver={1}.{2}.{3}"+ 
    "&from={4}"+ 
    "&realcomputername={5}"+ 
    "&type={6}"+ 
    "&Channels={7}"+ 
    "&Hotkeys={8}"+ 
    "&ID={9}\r\n", 
    serviceConfig.Computer, 
    serviceConfig.Version.Major, 
    serviceConfig.Version.Minor, 
    serviceConfig.Version.Build, 
    userName, 
    Environment.MachineName, 
    type, 
    serviceConfig.ChannelsString, 
    serviceConfig.HotKeysString, 
    serviceConfig.AlarmGroupName); 
0

En supposant que vous pouvez utiliser LINQ, vous pouvez pousser vos arguments dans un Dictionary<string, string>, puis rejoindre les arguments ensemble:

Dictionary<string, string> args = new Dictionary<string, string> 
{ 
    {"computer", serviceConfig.Computer}, 
    {"ver", string.Format("{0}.{1}.{2}", 
     serviceConfig.Version.Major, 
     serviceConfig.Version.Minor, 
     serviceConfig.Version.Build)}, 
    {"from", userName}, 
    {"realcomputername", Environment.MachineName}, 
    {"type", type}, 
    {"Channels", serviceConfig.ChannelsString}, 
    {"Hotkeys", serviceConfig.HotKeysString}, 
    {"ID", serviceConfig.AlarmGroupName}, 
}; 

string login = string.Join("&", args.Select(arg => 
    string.Format("{0}={1}", arg.Key, arg.Value)).ToArray()); 

Ce sera une infime quantité plus lente et plus gourmande en mémoire qu'un simple string.Format, mais il semble que vous êtes sur le point de faire une requête HTTP, donc je peux presque garantir que ce ne sera pas le goulot d'étranglement. Cette dernière ligne peut également être extraite dans une méthode d'extension que vous pouvez utiliser chaque fois que vous voulez créer une chaîne de requête comme celle-ci.

En outre, il est important de noter que, puisque le dictionnaire ne conserve pas l'ordre d'insertion, il n'est pas garanti que les paramètres de la chaîne de requête seront dans cet ordre exact. Cela ne devrait pas importer, mais dans le cas où vous le pouvez, vous pouvez remplacer le dictionnaire par un List<KeyValuePair<string, string>> (OrderedDictionary devrait également fonctionner).

Questions connexes