首页 > 解决方案 > 给定两个数组(String[],Float[]),如何实现找到最大值的方法

问题描述

我有两个数组,每个数组都有 12 个元素。一个是具有 4 种不同颜色的字符串数组,其余的是重复颜色。第二个数组是具有 12 个不同值的浮点数组。

string[] fishColor = new string[] {"blue", "red", "green", "pink", "blue", "pink", "blue", "red", "green", "blue", "red", "green"};

float[] fishLength = new float[12] { 8.2f, 17.1f, 23.2f, 2.3f, 5.5f, 7.83f, 9.6f, 10.7f, 12.3f, 4.2f, 8.71f, 9.17f };

目标是创建一种方法,可以找到给定颜色的最大浮点值。例如,共有 4 个值为“blue”的字符串,每个字符串都有一个对应的 float 值:

fishColor[0] = "Blue" 将与 fishLength[0] = 8.2
配对 fishColor[4] = "Blue" 将与 fishLength[4] = 5.5 配对

ETC...

该方法必须能够在重复项中找到最大的。

对于上下文,我有一个菜单,列出了字符串数组中的四种不同颜色。该程序中唯一的用户输入将是用户选择的菜单选项,因此是其中一种颜色。

 bool fin = false;

        Console.WriteLine("\r\nWelcome to BigBlueFish!\r\n\r\nPlease select a fish color below...");

        do
        {
            Console.WriteLine("\r\n[1] Blue");

            Console.WriteLine("\r\n[2] Red");

            Console.WriteLine("\r\n[3] Green");

            Console.WriteLine("\r\n[4] Pink");

            Console.WriteLine("\r\n[0] Exit to main menu");

            string strSelect = Console.ReadLine();

            int numSelect;

            try
            {
                numSelect = int.Parse(strSelect);

            }
            catch (FormatException)
            {
                Console.WriteLine("\r\nPlease select a menu option!");
                continue;
            }

            Console.WriteLine("\r\nYou have selected {0}", numSelect);

            switch (numSelect)
            {
                case 0:
                    Console.WriteLine("\r\nTill next time!");
                    fin = true;
                    break;

                case 1:
                    var mdata1 = FindBiggestFish(fishColor, fishLength);
                    Console.WriteLine("\r\nWell now seems like you found the biggest blue fish is {0}in", mdata1);
                    break;

                case 2:
                    var mdata2 = FindBiggestFish(fishColor, fishLength);
                    Console.WriteLine("\r\nWell now seems like you found the biggest red fish is {0}in", mdata2);
                    break;

                case 3:
                    var mdata3 = FindBiggestFish(fishColor, fishLength);
                    Console.WriteLine("\r\nWell now seems like you found the biggest green fish is {0}in", mdata3);
                    break;

                case 4:
                    var mdata4 = FindBiggestFish(fishColor, fishLength);
                    Console.WriteLine("\r\nWell now seems like you found the biggest pink fish is {0}in", mdata4);
                    break;

            }

        } while (!fin);


    }

    public static float FindBiggestFish(string[] col, float[] len)
    {
       float bgstCol = 0;

        var colAndLen = col.Zip(len, (c, l) => new { color = c, length = l });

        foreach(var cl in colAndLen)
        {
            if (cl.color.Distinct().Count() != cl.color.Count())
            {
                 rptCol = cl.color;
                 bgstCol = cl.length;
            }
        }

        return bgstCol;

    }

用户从菜单中选择一个选项并应用该方法,结果应如下所示:

选择是 1

哇,看起来最大的蓝鱼有 9.6 英寸

该方法将看到有 4 个“蓝色”鱼实例,并确定 4 个实例中最大的一个是 9.6。

所有这些要问,我将如何正确地将其作为一种方法实现?我最终尝试走 LINQ 路线,以便将两个数组配对在一起并使用 foreach 遍历它们,但我不太确定自己在做什么。任何有关如何实现这一点的见解将不胜感激。如果你还不能告诉我我是编程新手,请多多包涵,谢谢。

标签: c#arrayslinqforeach

解决方案


您可以尝试Zip以创建颜色/长度对

      var result = fishColor
          .Zip(fishLength, (c, l) => new {c, l})
          .Where(item => item.c == givenColor)
          .Max(item => item.l);

推荐阅读