2013-05-27 5 views
2

나는이 간단한 클래스가 있습니다문자열에 concat linq 쿼리 결과?

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

을 그리고 난 사전이 있습니다

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

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"}; 

그리고 여기에 내가 눈에 보이는 형태의 모든 항목을 참조

출력 :

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())); 

하지만 더 나은 (짧고, 우아한이 확신) way 다음 문장 사용 :

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

도움이 필요하십니까?

답변

4

당신은 사용할 수 ToArray에 대한 호출입니다 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

당신 솔루션 괜찮습니다, 나는 제거 할 수있는 유일한 것은 너무

Console.WriteLine (String.Join("\n",t)); 

또는

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

내가 잘못 생각한 것 같아요 :-(..... 내가 string.join을 가지고 있다고 말하지 ....... Linq의 선택 iterating입니다. 그리고 반복하면서 값에 문자열을 누적하고 싶습니다. –

+0

@ 로이 나미르, 너는 ** (더 짧고 우아한) **, IMO, string.Join은 짧고 우아하다. 반복과 관련하여 숨겨진 (선택의 경우) 또는 기타 여부에 관계없이 다른 옵션은 반복을 수반합니다. – Habib

+0

당신 말이 맞아요. 나는 그 말을해서는 안된다. 방금 열거 형을 통해 문자열의 누적을 배우고 tolist, string.join과 같은 외부 함수를 사용하지 않기를 원했습니다. –