Одна строка LINQ для выравнивания строки [] до строки?

Я придумал следующий хит, но я надеюсь, что это может быть достигнуто в одной строке.. может быть, linq? Любые идеи будут оценены.

foreach (string item in decoder.AllKeys)
{
    message += String.Format("{0}: {1} ;", item, decoder[item]);
}

Ответы

Ответ 1

var message = string.Join(
    ";", 
    decoder.AllKeys
           .Select(x => string.Format("{0}: {1} ", x, decoder[item]))
           .ToArray()
);

Ответ 2

Если вы используете .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());

Ответ 3

Класс String из BCL уже поддерживает это. Для достижения этого используется один лайнер с использованием класса String. Я бы всегда использовал операцию BCL, если бы она была доступна, учитывая, что ребята из MS уже приняли боль, чтобы оптимизировать такой важный класс.

String.Join(";", decoder.AllKeys);

Вот ссылка на MSDN для всех вариантов этого метода - http://goo.gl/kmwfYt

Ответ 4

Это должно работать.

decoder.AllKeys.Aggregate("", (current, item) => current + String.Format("{0}: {1} ;", item, decoder[item]));

Ответ 5

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

Ответ 6

Если у вас уже есть метод расширения соединения в 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 или любого другого декодера:)