如何使以下C#GroupBy功能更好?

时间:2012-01-03 18:04:14

标签: c#

我的Dictionary类型为IDictionary<string, Country>Key是城市名称,而Enum类型为Country

此词典中的项目如下所示:&lt;“Vancouver”,Country.Canada&gt;,&lt;“Seattle”,Country.US&gt ;,&lt;“New York”,Country.US&gt;等

我需要按值(即国家/地区)对词典中的所有项目进行分组。输出字符串如下:

“美国城市:纽约西雅图” “加拿大城市:温哥华”

这是我写的:

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

此代码有效。但我想知道它是否可以更简洁和优雅?

3 个答案:

答案 0 :(得分:4)

听起来你想要一个Lookup

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

目前还不清楚你需要对结果做什么 - 如果只是格式化,你可以使用string.Join投影......但我认为你真的需要做点什么更有趣。

答案 1 :(得分: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 ) )
);

答案 2 :(得分:1)

Jon Skeet回答说,这可能是你优雅的解决方案

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