提问者:小点点

如何使用匿名函数(lambda)复制此代码?


我有一个嵌套字典,看起来像这样:

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

共3个答案

匿名用户

您可以创建表示用户结果的类,而不是嵌套字典:

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