Ответ 1
var message = string.Join(
";",
decoder.AllKeys
.Select(x => string.Format("{0}: {1} ", x, decoder[item]))
.ToArray()
);
Я придумал следующий хит, но я надеюсь, что это может быть достигнуто в одной строке.. может быть, linq? Любые идеи будут оценены.
foreach (string item in decoder.AllKeys)
{
message += String.Format("{0}: {1} ;", item, decoder[item]);
}
var message = string.Join(
";",
decoder.AllKeys
.Select(x => string.Format("{0}: {1} ", x, decoder[item]))
.ToArray()
);
Если вы используете .NET 4.0, вы можете использовать это:
string message = string.Join(" ;", decoder.AllKeys
.Select(k => string.Format("{0}: {1}", k, decoder[k]));
Если вы еще не на .NET 4.0, вам нужно преобразовать коллекцию в массив:
string message = string.Join(" ;", decoder.AllKeys
.Select(k => string.Format("{0}: {1}", k, decoder[k]).ToArray());
Класс String из BCL уже поддерживает это. Для достижения этого используется один лайнер с использованием класса String. Я бы всегда использовал операцию BCL, если бы она была доступна, учитывая, что ребята из MS уже приняли боль, чтобы оптимизировать такой важный класс.
String.Join(";", decoder.AllKeys);
Вот ссылка на MSDN для всех вариантов этого метода - http://goo.gl/kmwfYt
Это должно работать.
decoder.AllKeys.Aggregate("", (current, item) => current + String.Format("{0}: {1} ;", item, decoder[item]));
IEnumerable<string> query =
from KeyValuePair<string, string> kvp in decoder
select String.Format("{0}: {1} ;", kvp.Key, kvp.Value);
string result = string.Join(null, query);
Если у вас уже есть метод расширения соединения в IEnumerable, как у меня:
public static string Join(this IEnumerable<string> values, string separator)
{
return string.Join(separator, values);
}
тогда остальное будет просто однострочным:
decoder.AllKeys.Select(item => String.Format("{0}: {1}", item, decoder[item])).Join(";");
Обратите внимание: если вы не используете .NET 4, вы можете заменить реализацию метода расширения на то, что работает для вашей версии.
EDIT: Еще лучше, создайте следующий метод расширения:
public static string Join(this IEnumerable<string> values, string separator, Func<string, string> selector)
{
return string.Join(separator, values.Select(selector));
}
и назовите его следующим образом:
decoder.AllKeys.Join(";", item => String.Format("{0}: {1}", item, decoder[item]));
вы не получите больше одной строки, чем это, кроме помещения метода расширения на NameValueCollection или любого другого декодера:)