一行LINQ将string []压扁为一个字符串?

时间:2011-05-22 16:26:52

标签: c# .net linq

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

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

6 个答案:

答案 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上放置扩展方法或者解码器是什么之外,你不会获得比这更多的单行:)