Как реализовать метод, который находит наибольшее значение, учитывая два массива (String [], Float []) - PullRequest
0 голосов
/ 28 марта 2020

У меня есть два массива по 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», и каждая из них имеет соответствующее значение с плавающей запятой:

fishColor [0] = «Blue» будет в паре с fishLength [0] = 8.2
fishColor [4] = "Синий" будет в паре с fishLength [4] = 5.5

et c ...

Метод должен быть в состоянии найти самый большой среди дубликатов.

Для контекста у меня есть меню, в котором перечислены четыре разных цвета в массиве строк. Единственный пользовательский ввод в этой программе - это опция меню, которую выбирает пользователь, поэтому один из цветов.

 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

Вау, похоже, самая большая синяя фигура sh составляет 9,6 дюйма

Метод будет видеть, что есть 4 экземпляра "синей" фигуры sh и найдите, что самый большой из 4 - 9,6.

Все это спросить, как бы я правильно реализовал это как метод? В итоге я попытался go по маршруту LINQ, чтобы объединить два массива и перебрать их с помощью foreach, но я не совсем уверен, что я делаю. Любое понимание того, как реализовать это, будет высоко ценится. Если я не могу сказать, что я новичок в программировании, так что терпите меня, спасибо.

Ответы [ 4 ]

1 голос
/ 28 марта 2020

Вы можете попробовать Zip для создания пар цвет / длина

      var result = fishColor
          .Zip(fishLength, (c, l) => new {c, l})
          .Where(item => item.c == givenColor)
          .Max(item => item.l);
0 голосов
/ 28 марта 2020

Вы можете сделать следующее.

var lookupTable = fishColor.Zip(fishLength,(x,y)=>new {color=x,value=y}).ToLookup(x=>x.color);
var result = lookupTable[colorToSearch].Max(c=>c.value);

ToLookup выполняется немедленно, в отличие от GroupBy (это разные исполнения). Поэтому, если вы намеревались использовать одну и ту же коллекцию для поиска наибольшего значения разного цвета несколько раз, может быть лучше сделать один раз ToLookup, а затем выполнить поиск по нему.

0 голосов
/ 28 марта 2020

Вы можете заполнить словарь необходимой парой значений, используя приведенный ниже код.

        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 };

        var dictFish = new Dictionary<string, float>();
        int index = 0;
        fishColor.ToList().ForEach(s =>
        {
            if (!dictFish.ContainsKey(s))
                dictFish.Add(s, fishLength[index]);
            else
            {
                if (dictFish[s] < fishLength[index])
                    dictFish[s] = fishLength[index];
            }
            index++;
        });
0 голосов
/ 28 марта 2020

L oop для всех записей и сохранить максимум для цвета:

var max_values = new Dictionary<string,double>();
for( int i=0; i<fishColor.Length; i++)
{
  var clr = fishColor[i];
  var len = fishLength[i];
  if (! max_values.ContainsKey( clr ) )
  {
    max_values.Add( clr , len );
    continue;
  }
  if (max_values[ clr ] < len )
    max_values[ clr ] = len;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...