Какое наиболее удобочитаемое использование String.Format для длинных строк с множеством параметров?

Например:

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

Это не делает код очень читаемым, и по мере того, как добавляется все больше и больше параметров, он выглядит все более уродливым и более запутанным, чтобы найти, какой параметр находится в каком слоте.

Я знаю, что это нубский вопрос, и я думаю, что спрашиваю только о том, как отформатировать текст, чтобы он был более читабельным, но если есть лучший способ сделать это, я бы тоже хотел это знать.


person mlusby    schedule 06.10.2009    source источник
comment
См. также: stackoverflow.com/questions/1322037/   -  person Marc Gravell    schedule 07.10.2009
comment
Также stackoverflow.com/questions/ 1010123/   -  person Mauricio Scheffer    schedule 07.10.2009


Ответы (2)


Вы можете посмотреть StringBuilder и разделить сборку строки на несколько строк.

метод AppendFormat (спасибо, Джоэл) — это то, что вам нужно в данном случае.

person ChrisF    schedule 06.10.2009
comment
Тем более, что вызовы String.Format() создают StringBuilder и в любом случае вызывают его метод AppendFormat() за кулисами. - person Joel Coehoorn; 07.10.2009

Предполагая, что вы можете использовать LINQ, вы можете поместить свои аргументы в Dictionary<string, string>, а затем объединить аргументы вместе:

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());

Это будет немного медленнее и требует больше памяти, чем простой string.Format, но похоже, что вы собираетесь сделать HTTP-запрос, поэтому я почти могу гарантировать, что это не будет узким местом.

Эта последняя строка также может быть преобразована в метод расширения, который вы можете использовать в любое время, когда захотите построить строку запроса, подобную этой.

Кроме того, важно отметить, что, поскольку Dictionary не сохраняет порядок вставки, нет гарантии, что параметры в строке запроса будут в точном порядке. Это не должно иметь значения, но в этом случае вы можете заменить Dictionary на List<KeyValuePair<string, string>> (OrderedDictionary также должен работать).

person Zack Elan    schedule 06.10.2009