2011-05-22 63 views
13

我想出了以下的foreach,但我希望这可以在一行中完成..也许linq?任何想法,将不胜感激。一行LINQ将字符串[]压扁为字符串?

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

马的课程。你的foreach比任何人都可以用LINQ做的更具可读性和简洁性,我认为:) – 2011-05-22 16:39:44

+0

你不喜欢foreach解决方案是什么?它是嵌套括号吗?是否需要学习linq语法?它是迭代之前的消息变量的声明吗? – 2011-05-22 17:52:15

+0

使用'StringBuilder'类而不是连续地将'String'与+ =连接起来,以避免连续的新'String'分配,因为'String'是不可变的。 – 2014-10-09 15:03:04

回答

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

一行。结果比原来的要长。 – Hogan 2011-05-22 16:37:57

+5

@Hogan,这是真的,但原始代表一个'foreach'循环中的字符串连接,由于.NET中字符串的不变性,这可能会产生问题。为了改进原来的'StringBuilder'应该已经被使用了。 – 2011-05-22 16:39:39

+4

'.ToArray'在这里我认为是不必要的? 'string.Join'也适用于'IEnumerable '。 – 2011-05-22 16:50:28

6

如果您在.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()); 
3

这应该有效。

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

尽管这是原文的良好翻译,但这会导致为数组中的每个项目创建额外的字符串,而使用“String.Join”则不会。 – Gabe 2011-05-22 17:53:42

0

如果您已经在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上放置扩展方法,或任何解码器:)

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

我认为你是迄今为止唯一的答案,保留后缀分号,但我怀疑OP的代码的下一行删除它... – Gabe 2011-05-22 17:55:13

5

BCL的String类已经支持这个。这里使用String类来实现这一点。如果有可用的话,我会一直使用BCL操作,因为考虑到MS们已经为优化这样一个关键的课程而付出了痛苦。

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

这里是链接到MSDN上有关此方法的所有变种 - http://goo.gl/kmwfYt

+0

准确的单线! – netfed 2017-10-16 01:41:02