我想出了下面的foreach,但我希望这可以在一行中完成..也许linq?任何想法都将不胜感激。
foreach (string item in decoder.AllKeys)
{
message += String.Format("{0}: {1} ;", item, decoder[item]);
}
答案 0 :(得分:16)
var message = string.Join(
";",
decoder.AllKeys
.Select(x => string.Format("{0}: {1} ", x, decoder[item]))
.ToArray()
);
答案 1 :(得分:6)
如果您使用的是.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());
答案 2 :(得分:5)
BCL的String类已经支持了这一点。这是使用String类实现此目的的一个衬垫。我总是会使用BCL操作,如果它可以在那里使用,考虑到MS人员已经在努力优化这样一个至关重要的课程。
String.Join(";", decoder.AllKeys);
以下是此方法所有变体的MSDN链接 - http://goo.gl/kmwfYt
答案 3 :(得分:3)
这应该有用。
decoder.AllKeys.Aggregate("", (current, item) => current + String.Format("{0}: {1} ;", item, decoder[item]));
答案 4 :(得分:1)
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);
答案 5 :(得分:0)
如果你已经在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上放置扩展方法或者解码器是什么之外,你不会获得比这更多的单行:)