一行 LINQ 用于将字符串 [] 平展为字符串

本文关键字:字符串 用于 一行 LINQ | 更新日期: 2023-09-27 17:57:08

我想出了下面的foreach,但我希望这可以在一行中完成.. 也许是linq?任何想法将不胜感激。

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

一行 LINQ 用于将字符串 [] 平展为字符串

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

BCL 的 String 类已经支持此功能。下面是使用 String 类实现此目的的一行。如果BCL操作在那里可用,我会一直使用它,考虑到MS的人已经竭尽全力优化这样一个关键的类。

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

下面是此方法的所有变体的 MSDN 链接 - http://goo.gl/kmwfYt

如果你使用的是 .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());

这应该有效。

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 上有一个 Join 扩展方法,就像我一样:

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,则可以将扩展方法的实现替换为适用于你的版本的任何内容。

编辑:更好的是,创建以下扩展方法:

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上放置一个扩展方法,或者任何解码器:)