簡體   English   中英

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

[英]How to make the following C# GroupBy function better?

我有一個IDictionary<string, Country>類型的Dictionary ,其Key是城市的名稱,而值是CountryEnum類型。

該詞典中的項目如下所示:<“ Vancouver”,Country.Canada>,<“ Seattle”,Country.US>,<“ New York”,Country.US>等。

我需要按值(即國家/地區)將字典中的所有項目分組。 並輸出如下字符串:

“美國城市:紐約州西雅圖”“加拿大城市:溫哥華”

這是我寫的:

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

此代碼有效。 但是我想知道它是否可以更簡潔,更優雅?

聽起來您想要一個Lookup

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

目前尚不清楚您需要對結果做些什么-如果只是格式化,則可以使用string.Join和一個投影...但是我認為您確實需要做一些更有趣的事情。

進行反向交易會不會更容易?

IDictionary<Country, IList<string>>

似乎在所存儲項目的層次結構中更有意義。

這是你想要的嗎?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM