我有一个嵌套字典,看起来像这样:
Dictionary<string, Dictionary<string, int>> users = new Dictionary<string, Dictionary<string, int>>();
第一个字符串是用户的名字,第二个字符串是他参加的比赛,int是他的分数。一个用户可以参加多个比赛。
我的任务是通过添加他所有的分数来找到得分最高的用户。现在我使用了以下代码:
foreach (var user in users)
{
bestUsers.Add(user.Key, 0);
foreach (var contest in user.Value)
{
bestUsers[user.Key] += contest.Value;
}
}
我想知道如何通过使用匿名函数来实现,如下所示:
KeyValuePair<string, int> bestUser = users.OrderBy(x => x.Value.Sum());
您可以创建表示用户结果的类,而不是嵌套字典:
public class UserGameResults
{
public string Name { get; set; } // the name of the user
public int TotalScore { get => GameResults.Select(x => x.Value).Sum(); } // total score of all games, will be calculated every time the property is accessed
public Dictionary<string,int> GameResults { get; set; } = new Dictionary<string,int>(); // key is the name of the game, value is the score
}
如果你使用字典
var bestResult = users.OrderByDescending(x => x.Value.TotalScore).FirstOrDefault();
此外,一个字典
对于使用linq而不是2个foreach循环获取字典的代码重构,您可以使用如下内容:
users.ToDictionary(u => u.Key, u => u.Value.Select(c => c.Value).Sum());
或者我认为Sum选了一个λ
users.ToDictionary(u => u.Key, u => u.Value.Sum(c => c.Value));
应该是有效的
试试这个
var dict = new Dictionary<string, Dictionary<string, int>> {
{ "name1", new Dictionary<string, int>{ { "A", 2 }, {"B", 3 }}},
{ "name2", new Dictionary<string, int>{ { "C", 4 }, {"D", 5 }}}
};
var scores = dict.Select(d => new { name = d.Key, score = d.Value.Select(x => x.Value).Sum() } )
.ToList().OrderByDescending (d =>d.score );
分数
name2 9
name1 5