我需要使用C#在数组中找到最大值

时间:2019-01-31 16:45:55

标签: c# multidimensional-array

我有五个国家的多维阵列和一些奖牌。最后一栏是总数,我需要归还最多奖牌的国家。只要没有两个国家拥有相同数量的奖牌,而最大数量的奖牌不存在,我的代码就是“有效的”。 可能我只是对数组没有足够的经验,但是如果需要的话,如何返回多个contry?

string [,] medals = new string[5, 5];

        Random rdn = new Random();

        medals[0, 0] = "Brazil";
        medals[1, 0] = "USA";
        medals[2, 0] = "Russia";
        medals[3, 0] = "France";
        medals[4, 0] = "Egypt";

        for (int i = 0; i < medals.GetLength(0); i++)
            for (int j = 1; j < medals.GetLength(1); j++)
            {
                //This fills the gold, silver and copper medals
                if (j < medals.GetLength(1)-1)
                    medals[i, j] = rdn.Next(1, 6).ToString();
                else
                    //This fills the total medals
                    medals[i, j] = (int.Parse(medals[i, 1]) + int.Parse(medals[i,2]) + int.Parse(medals[i,3])).ToString();
            }

        //The first index stores the max number so far and the second stores the name of the country
        string [] winner = { "0", "0" };

        for (int i = 0; i < medals.GetLength(0); i++)
        {
            if (int.Parse(medals[i,4]) > int.Parse(winner[0]))
            {
                winner[0] = medals[i, 4];
                winner[1] = medals[i, 0];
            }
        }

3 个答案:

答案 0 :(得分:1)

您可以使用列表来存储获奖者。

JSON.parse(a.to_json)

但是我想重申一下评论中所说的话,如果可以使用Object List而不是多维数组,那就更好了。这样可以提高代码的可读性,并使事情简单得多。

答案 1 :(得分:0)

字典将是一个容易得多的起点。然后,您可以根据dict中的值进行排序,并使用简单的循环检查重复值。

答案 2 :(得分:0)

在很多事情上,我会做的与您不同,但这并不重要(请参阅结尾处的注释)。您的问题是如何处理多个国家拥有相等数量和最大数量奖牌的情况。

  

如何返回多个国家?

好吧,这很简单:假设您通过以下函数返回了获胜者:

string[] GetWinner() {
    // your code
    return new[] { "20", "USA" };
}

然后数据类型没有变化,只需将另一个国家/地区添加到数组中,调用代码应检查您有多少个

string[] GetWinner() {
    // your code
    return new[] { "20", "USA", "CAN" };
}

现在,如果在创建数组时如何创建大小未知的数组存在问题,那么通常的解决方案是使用List<>,在这种情况下,它将用作可调整大小的数组,你。

最终代码如下所示

static string[]  GetWinner(string[,]  medals) {

    int rows = medals.GetLength(0);

    var winners = new List<string>();
    int maxMedals = 0;
    for (var i = 0; i < rows; i++) {
        var n = int.Parse(medals[i, 4]);
        maxMedals = n > maxMedals ? n : maxMedals;
    }

    for (var i = 0; i < rows; i++) {
        var n = int.Parse(medals[i, 4]);
        if (n == maxMedals)
            winners.Add(medals[i, 0]);
    }

    winners.Insert(0, maxMedals.ToString());

    return winners.ToArray();
}

现在,我建议您使用更好的数据结构来存储您的奖牌。但是由于我不了解全部情况,所以我想,类似下面的内容是合理的。如果与这些对象相关的代码限于代码文件的一小部分,则可以使用ValueTuple-简化代码,而不使用命名类型。这应该避免分配与2D数组关联的大块内存,并且还应避免将int存储在字符串中。

public class CountryMedalTally {
    public string Country { get; set; }
    public string[] Medals { get; set; }
    public int MedalCount { get; set; }
}

public class Winner {
    public List<string> Country { get; set; }
    public int MedalCount { get; set; }
}

List<CountryMedalTally> AllMedals;