[英]How to make the following C# GroupBy function better?
我有一個IDictionary<string, Country>
類型的Dictionary
,其Key
是城市的名稱,而值是Country
的Enum
類型。
該詞典中的項目如下所示:<“ 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.