C#查找整数的最大值,然后输出最大值的变量名称

问题描述 投票:-1回答:1

我正在遍历2d数组,在每一行的末尾,我需要找到最大值。每行有6个值,因此使用Math.Max重复可能很长。那么,除了Math.Max之外,还有其他要使用的东西吗?之后,我不需要知道结束的值,而是需要知道最高值的变量名。有什么建议吗?

这是我当前的代码。

        for(int col = 0; col < geneArrays.GetLength(0); col++)
                    {
                        for(int row = 0; row < geneArrays.GetLength(1); row++)
                        {
                            float G = 0f, Y = 0f, H = 0f, X = 0f, W = 0f;
                            if (geneArrays[col][row] == 'G')
                            {
                                G += 0.6f;
                            }
                            else if (geneArrays[col][row] == 'Y')
                            {
                                Y = +0.6f;
                            }
                            else if (geneArrays[col][row] == 'H')
                            {
                                H = +0.6f;
                            }
                            else if (geneArrays[col][row] == 'X')
                            {
                                X = +0.6f;
                            }
                            else if (geneArrays[col][row] == 'W')
                            {
                                W = +0.6f;
                            }
                            string nameOfVariable = nameof(Math.Max(G,Y);
                        }
                    }

我显然没有正确使用nameof,我认为Math.Max使它出错。

c#
1个回答
0
投票

Math.Max返回两个输入值的值。在此示例中,您将只知道G,Y的值。但是,考虑到您拥有多个然后被完全忽略的值,这毫无意义。我建议您将它们添加到列表中,并对它们进行排序,以便可以找到顶部变量:

class Program
    {
        static void Main(string[] args)
        {
            char[,] dataArray = new char[3, 10];

            //Test data input generation.
            for (int i = 0; i < 10; i++)
            {
                dataArray[0, 0] = 'G';
                dataArray[0, 1] = 'Y';
                dataArray[0, 2] = 'H';
                dataArray[0, 3] = 'X';
                dataArray[0, 4] = 'W';
                dataArray[0, 5] = 'G';
                dataArray[0, 6] = 'G';
                dataArray[0, 7] = 'Y';
                dataArray[0, 8] = 'W';
                dataArray[0, 9] = 'X';
                dataArray[1, 0] = 'G';
                dataArray[1, 1] = 'Y';
                dataArray[1, 2] = 'H';
                dataArray[1, 3] = 'X';
                dataArray[1, 4] = 'W';
                dataArray[1, 5] = 'G';
                dataArray[1, 6] = 'G';
                dataArray[1, 7] = 'Y';
                dataArray[1, 8] = 'W';
                dataArray[1, 9] = 'X';
                dataArray[2, 0] = 'G';
                dataArray[2, 1] = 'Y';
                dataArray[2, 2] = 'H';
                dataArray[2, 3] = 'X';
                dataArray[2, 4] = 'W';
                dataArray[2, 5] = 'G';
                dataArray[2, 6] = 'G';
                dataArray[2, 7] = 'Y';
                dataArray[2, 8] = 'W';
                dataArray[2, 9] = 'X';
            }



            List<List<NameAndValue>> totalList = new List<List<NameAndValue>>();


            for (int j = 0; j < 3; j++)
            {
                List<NameAndValue> geneNameValues = CreateNameAndValueList();
                for (int k = 0; k < 10; k++)
                {
                    switch (dataArray[j, k])
                    {
                        case 'G':
                            {
                                geneNameValues.First(x => x.Name.Equals('G')).Value += 0.6m;
                                break;
                            }
                        case 'Y':
                            {
                                geneNameValues.First(x => x.Name.Equals('Y')).Value += 0.6m;
                                break;
                            }
                        case 'H':
                            {
                                geneNameValues.First(x => x.Name.Equals('H')).Value += 0.6m;
                                break;
                            }
                        case 'X':
                            {
                                geneNameValues.First(x => x.Name.Equals('X')).Value += 0.6m;
                                break;
                            }
                        case 'W':
                            {
                                geneNameValues.First(x => x.Name.Equals('W')).Value += 0.6m;
                                break;
                            }
                    }
                }
                totalList.Add(geneNameValues);
            }
            int listCount = 0;
            foreach (List<NameAndValue> list in totalList)
            {
                list.Sort((x, y) => x.Value.CompareTo(y.Value));
                NameAndValue highestValue = list.Last();
                Console.WriteLine("List-count: " + listCount + " The highest value was: " + highestValue.Name + " with a score of: " + highestValue.Value);
                listCount++;
            }
        }

        public static List<NameAndValue> CreateNameAndValueList()
        {
            NameAndValue item1 = new NameAndValue() { Name = 'G', Value = 0m };
            NameAndValue item2 = new NameAndValue() { Name = 'Y', Value = 0m };
            NameAndValue item3 = new NameAndValue() { Name = 'H', Value = 0m };
            NameAndValue item4 = new NameAndValue() { Name = 'X', Value = 0m };
            NameAndValue item5 = new NameAndValue() { Name = 'W', Value = 0m };

            List<NameAndValue> valueList = new List<NameAndValue>() { item1, item2, item3, item4, item5 };
            return valueList;
        }
    }

    public class NameAndValue
    {
        public decimal Value { get; set; }
        public char Name { get; set; }
    }

我建议您为这样的事情设置单元测试:

提供一组受控的输入数据,您可以在其中确定预期的结果。

然后考虑您的期望值边界。建立您确定的足够样本,测试将捕获其中的任何逻辑错误,然后继续进行逻辑优化。有很多工作要做。

我知道这是一种重写。但是它确实执行了您要求的功能。现在,您只需要将硬编码的3,10值更改为您的foreach系统。

但是如果没有更好的输入,我将不敢写一个现实的实现。

另外,我将浮点数更改为十进制C#在舍入浮点数方面也很糟糕。特别是在计算中。如果要查看对人脑有意义的数字,请使用十进制。

只需将此代码复制到{}的“命名空间”集中,它将执行。而且只要名称空间是控制台应用程序:)

© www.soinside.com 2019 - 2024. All rights reserved.