2013-05-27 184 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等外部函數。 –