2013-05-27 148 views
2

我有这个简单的类:concat linq查询结果为字符串?

class A 
{ 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

而且我有一本字典:

Dictionary<string,A> dic = new Dictionary<string,A>();

dic["a"]=new A(){ Age=2, Name="aa"}; 
dic["b"]=new A(){ Age=3, Name="baa"}; 
dic["c"]=new A(){ Age=4, Name="caa"}; 

在这里,我看到一个明显的方式,所有的项目:

Console.WriteLine (dic.Select(f=>f.Key+" =>"+f.Value.Age+" "+f.Value.Name));

输出:

a =>2  aa 
b =>3  baa 
c =>4  caa 

但我希望它是一个字符串!

这样的字符串值:

@"a =>2  aa \n 
    b =>3  baa \n 
    c =>4  caa "; 

我可以与ToArray的和的string.join做到这一点:

var t=dic.Select(f=>f.Key+" =>"+f.Value.Age+"  "+f.Value.Name); 
Console.WriteLine (String.Join("\n",t.ToArray())); 

但我敢肯定有一个更好的(更短,高贵典雅)方式 使用此语句:(加上一点)

dic.Select(f=>f.Key+" =>"+f.Value.Age+" "+f.Value.Name)

任何帮助?

回答

4

您可以使用Aggregate Extension Method

string s = dic.Aggregate(String.Empty, 
         (current, f) => 
         String.Format("{0}\n{1} => {2} {3}", 
             current, 
             f.Key, 
             f.Value.Age, 
             f.Value.Name)) 
       .TrimStart(); 

或者使用StringBuilder

string s = dic.Aggregate(new StringBuilder(), 
         (current, f) => 
         current.AppendLine(
          String.Format("{0} => {1} {2}", 
           f.Key, 
           f.Value.Age, 
           f.Value.Name)) 
       .ToString(); 
2

您的解决方案是好的,我想摆脱的唯一的事情就是调用ToArray,所以

​​

Console.WriteLine (String.Join(Environment.NewLine, t)); 
+0

我想我被误解了:-(.....让我们说我没有string.join ....... Linq的选择迭代。我想在迭代时将值累加到字符串中。 –

+0

@RoyiNamir,你说**(短,优雅)**,国际海事组织,字符串。加入更短,更优雅。就迭代而言,任何其他选项都会涉及迭代,无论是隐藏的(在选择的情况下)还是其他的。 – Habib

+0

你说得对。我不应该说这些话。我只想通过枚举学习字符串的积累,而不是使用tolist,string.join等外部函数。 –