我想出了以下的foreach,但我希望这可以在一行中完成..也许linq?任何想法,将不胜感激。一行LINQ将字符串[]压扁为字符串?
foreach (string item in decoder.AllKeys)
{
message += String.Format("{0}: {1} ;", item, decoder[item]);
}
我想出了以下的foreach,但我希望这可以在一行中完成..也许linq?任何想法,将不胜感激。一行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()
);
一行。结果比原来的要长。 – Hogan 2011-05-22 16:37:57
@Hogan,这是真的,但原始代表一个'foreach'循环中的字符串连接,由于.NET中字符串的不变性,这可能会产生问题。为了改进原来的'StringBuilder'应该已经被使用了。 – 2011-05-22 16:39:39
'.ToArray'在这里我认为是不必要的? 'string.Join'也适用于'IEnumerable
如果您在.NET 4.0的时候,你可以这样做:如果你不是在.NET 4.0还
string message = string.Join(" ;", decoder.AllKeys
.Select(k => string.Format("{0}: {1}", k, decoder[k]));
,你需要收集转换成array:
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]));
尽管这是原文的良好翻译,但这会导致为数组中的每个项目创建额外的字符串,而使用“String.Join”则不会。 – Gabe 2011-05-22 17:53:42
如果您已经在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,那么您可以将扩展方法的实现替换为适用于您的版本的任何内容。
编辑: 更妙的是,创建下面的扩展方法:
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上放置扩展方法,或任何解码器:)
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);
我认为你是迄今为止唯一的答案,保留后缀分号,但我怀疑OP的代码的下一行删除它... – Gabe 2011-05-22 17:55:13
BCL的String类已经支持这个。这里使用String类来实现这一点。如果有可用的话,我会一直使用BCL操作,因为考虑到MS们已经为优化这样一个关键的课程而付出了痛苦。
String.Join(";", decoder.AllKeys);
这里是链接到MSDN上有关此方法的所有变种 - http://goo.gl/kmwfYt
准确的单线! – netfed 2017-10-16 01:41:02
马的课程。你的foreach比任何人都可以用LINQ做的更具可读性和简洁性,我认为:) – 2011-05-22 16:39:44
你不喜欢foreach解决方案是什么?它是嵌套括号吗?是否需要学习linq语法?它是迭代之前的消息变量的声明吗? – 2011-05-22 17:52:15
使用'StringBuilder'类而不是连续地将'String'与+ =连接起来,以避免连续的新'String'分配,因为'String'是不可变的。 – 2014-10-09 15:03:04