我发布这个的唯一原因是因为我实际上认为我的代码性能受到这个代码块的影响,我在另一个代码块中使用了foreach循环。
我想知道是否有人会提出任何可能有助于提高性能的内容,或者可能会在代码中指出其他一些缺陷。
public override void DisplayScore()
{
byte MessageLocation = 0;
foreach (var kvp in PlayerScores.OrderByDescending((s => s.Value)))
{
if (MessageLocation == 5)
break;
if (MessageLocation == PlayerScores.Count)
break;
foreach (var player in PlayerList.Values)
{
SendMessage(MessageLocation, "My text");
}
Score++;
}
}
正如你所看到的,它只是按照降序从字典中显示前5个分数(在不同位置)并将它们发送到另一个字典中的播放器列表。
答案 0 :(得分:1)
我不认为双循环是问题所在。我建议检查LINQ查询PlayerScores.OrderByDescending((s => s.Value))
。根据得分的数量,这可能需要时间来订购,特别是如果值来自字典。 dictinary的内部结构使得通过键和值枚举成本很高。
您可以使用以下代码(稍微改进)和Visual Studio 2015对其进行测试,可以看出,单个执行步骤需要多长时间:
public override void DisplayScore()
{
var scores = PlayerScores.OrderByDescending(s => s.Value).Take(5).ToArray();
foreach (var kvp in scores)
{
foreach (var player in PlayerList.Values)
{
SendMessage(MessageLocation, "My text");
}
}
}
答案 1 :(得分:0)
您可以通过将分数添加到列表然后将其发送给玩家来获得一些性能,而不是嵌套for循环,例如:
//List containing player and score
foreach (var kvp in PlayerScores.OrderByDescending((s => s.Value)))
{
//Add scores to list
}
foreach (var player in PlayerList.Values)
{
//Send scores to players
}