我的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));
}
此代码有效。但我想知道它是否可以更简洁和优雅?
答案 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)));
}