2012-01-03 8 views
1

私はIDictionary<string, Country>タイプのDictionaryを持っていて、Keyは都市名であり、値はEnumタイプ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

@ハンター:あなたが意味することは分かりませんが、 'Dictionary 'で始まっていれば、都市ごとに1組しか存在できません。 –

+1

Woohoo、この質問はJonの注目を集めました!私は後であなたの提案を試みます。 – 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))); 
    } 
関連する問題