如何按每行的最高值对多维数组进行排序?

时间:2014-05-20 20:27:32

标签: c# arrays sorting multidimensional-array

我正在制作系统以跟踪玩家,他们的三个分数,然后找出胜利者。获胜者是三个单独拍摄中得分最高的人。换句话说,分数不会加起来,它只是最重要的。

作为一个例子,我刚刚在这里硬编码了值。数组的第一个索引号是名称的顺序。约翰得到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}
               };

现在我想制作一个功能,确定哪个玩家在这三个尝试中得分最高,并按名称顺序显示三个最高分(每人一个)。 所以标签中的输出最终会像这样::

  • 1。)Jim - 44
  • 2。)John - 42
  • 3。)Joe - 40

因此,正如我所看到的那样,问题在于必须检查每一行的最高值,然后可以在保持跟踪谁拥有分数的同时创建一个新阵列,以正确打印它。 (我对此很陌生。)有没有人知道如何实现这一结果?

2 个答案:

答案 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;