我正在制作系统以跟踪玩家,他们的三个分数,然后找出胜利者。获胜者是三个单独拍摄中得分最高的人。换句话说,分数不会加起来,它只是最重要的。
作为一个例子,我刚刚在这里硬编码了值。数组的第一个索引号是名称的顺序。约翰得到42分,38分,然后是43分,等等。
string[] player = {"John", "Jack", "Joe", "Jim", "Jacob"};
int[,] stats = {
{42, 38, 43},
{37, 36, 39},
{35, 40, 37},
{41, 44, 38},
{33, 34, 37}
};
现在我想制作一个功能,确定哪个玩家在这三个尝试中得分最高,并按名称顺序显示三个最高分(每人一个)。 所以标签中的输出最终会像这样::
因此,正如我所看到的那样,问题在于必须检查每一行的最高值,然后可以在保持跟踪谁拥有分数的同时创建一个新阵列,以正确打印它。 (我对此很陌生。)有没有人知道如何实现这一结果?
答案 0 :(得分:2)
Linq有一个名为“Zip”的酷炫功能,它基本上就像两个可枚举集合上的拉链一样。它逐项进行,并根据每个集合中相同索引处的项目创建结果。
所以你可以这样做:
player.Zip(stats,(p,i) => new { Player = p, HighScore = i.Max() })
.OrderBy(m => m.HighScore)
然后,您可以对该结果进行预测,以便按顺序打印您的获奖者。
编辑:不是100%肯定可以使用多维数组。希望它能让你朝着正确的方向前进。
答案 1 :(得分:0)
public class Player
{
public string Name { get; set; }
public List<int> Score { get; set; }
}
List<Player> playerList = new List<Player>();
playerList.Add(new Player() { Name = "John", Score = new List<int>() { 42, 38, 43 } });
playerList.Add(new Player() { Name = "Jack", Score = new List<int>() { 37, 36, 39 } });
playerList.Add(new Player() { Name = "Joe", Score = new List<int>() { 35, 40, 37 } });
playerList.Add(new Player() { Name = "Jim", Score = new List<int>() { 41, 44, 38 } });
playerList.Add(new Player() { Name = "Jacob", Score = new List<int>() { 33, 34, 37 } });
var result2 = from p in playerList orderby p.Score.Max() descending select p;
var result = from p in playerList where p.Score.Max() == ((from x in playerList select new { x.Name, MaxScore = x.Score.Max() }).Max(x => x.MaxScore)) select p;