2012-01-03 2 views
1

나는 IDictionary<string, Country> 유형의 Dictionary이며, Key은 도시 이름이며 값은 유형이 Country입니다. 다음과 같을 것이다이 사전에다음 C# GroupBy 함수를 더 잘 만드는 방법은 무엇입니까?

항목 : < "밴쿠버", Country.Canada>, < "시애틀", Country.US>, < "뉴욕", Country.US> 등

I dictionry의 모든 항목을 값 (예 : 국가)별로 그룹화해야합니다. 그리고이 같은 출력 문자열 :

"미국 도시 : 시애틀, 뉴욕" "캐나다 도시 : 밴쿠버은"여기

내가 작성한 것입니다 :

public void GroupByCountry(IEnumerable<KeyValuePair<string, Country>> dict) 
{ 
    string text = string.Empty; 
    var groups = dict.GroupBy(p => p.Value, p => p.Key); 
    foreach (var g in groups) 
    { 
     List<string> citiesInGroup = new List<string>(); 
     foreach (string city in g) 
     { 
      citiesInGroup.Add(ext); 
     } 
     text += string.Format("{0}: {1}\n", Enum.GetName(typeof(Country), g.Key), string.Join("|", citiesInGroup.ToArray())); 
    } 
    Log.Info(logCategory, string.Format("Result:\n{0}", text)); 
} 

이 코드는 작동합니다. 그러나 그것이 더 간결하고 우아 할 수 있는지 궁금합니다.

답변

4

그것은 소리 Lookup :

Lookup<Country, string> lookup = dict.ToLookup(pair => pair.Value, 
               pair => pair.Key); 

당신이 결과로 무엇을해야하는지 분명하지 않다 - 그것은 단지 형식 인 경우에, 당신이 돌기 string.Join를 사용할 수 있습니다 ...하지만 당신이 정말로 더 흥미로운 것을 할 필요가 있다고 가정하십시오.

+0

많은 도시에서 똑같은 '열쇠'로 끝날 수는 없을까? 아니면'ToLookUp'이 그 시나리오를 처리합니까? – hunter

+0

@hunter : 무슨 의미인지는 모르겠지만 'Dictionary '로 시작할 경우 어쨌든 도시 당 한 쌍만있을 수 있습니다. –

+1

우후,이 질문에 존의 주목을 받았습니다! 나는 너의 제안을 나중에 시도 할 것이다. – sean717

3

역순으로 바꾸는 것이 더 쉬울까요?

IDictionary<Country, IList<string>>

저장 항목의 계층 구조에서 더 이해하게 해주는 것 같다. 당신이 원하는 것처럼

+0

예, 그것은 않는 당신의 우아한 해결책이 될 수 있습니다. 그러나 그것은 나에게 넘겨 질 때와 같았습니다. 나는 그것을 설계 한 사람이 아니다 :) – sean717

2

이게 원하는가요? 존 소총의와

from de in dict 
group de by de.Value into dg 
select String.Join("\n", dg.Key + ": " + 
    String.Join("|", dg.Select(v => v.Key)) 
); 
1

는 대답이

Lookup<Country,String> lookup = (Lookup<Country,String>) dict.ToLookup(pair => pair.Value, 
                      pair => pair.Key); 
foreach (var a in lookup) 
    { 
     strOutput += string.Format("{0}:{1} ", a.Key, 
            string.Join(",", a.Select(s => s))); 
    } 
관련 문제