VK28111995
@VK28111995
Interested in C# and have big passion by AI

Задача выдает не правильное значение(работа с делегатами и анонимными методами)?

Суть задачи проста - нужно создать проект по шаблону Console Application(.NET Core). Создать анонимный метод, который принимает в качестве аргумента массив делегатов и возвращает среднее арифметическое возвращаемых значений методов сообщенных с делегатами в массиве. Методы, сообщенные с делегатами из массива, возвращают случайное значение типа int.

Мое решение:

using System;

namespace ConsoleApp44
{
    public delegate int Number();
    public delegate int MediumCalc(Number[] arrayX);
    class Program
    {
        public static int Randomizer()
        {
            Random rand = new Random();
            return rand.Next(1, 10);
        }
        static void Main(string[] args)
        {
            Number[] numArr = new Number[5];
            for(int i = 0; i < numArr.Length; i++)
            {
                numArr[i] = Randomizer;
                Console.Write(" " + numArr[i].Invoke() + " ");
            }
            Console.WriteLine();
                
            MediumCalc mediumCalc = delegate (Number[] arrayX)
            {
                int sum = 0;
                for (int i = 0; i < arrayX.Length; i++)
                {
                    sum += arrayX[i]();
                }
                return ((sum) / (arrayX.Length));
            };

            Console.WriteLine(mediumCalc(numArr));

            Console.ReadKey();
        }
    }
}


Но возникает проблема- в результате он выдает не правильное сред. арифметическое значение.
Допустим если метод Randomizer() "выплюнул" 5 чисел - {6, 8, 6, 3, 5}
А mediumCalc(numArr) возвращает { 3 }.
Что совершенно не логично с моей точки зрения( (6 + 8 + 6 +3 + 5) / (5) != 3)
Подскажите может я что то где то накосячил или напутал!
  • Вопрос задан
  • 1037 просмотров
Решения вопроса 1
Griboks
@Griboks Куратор тега C#
Во-первых, при выводе в консоль генерируется новое число. В итоге, на экране выводится один набор чисел, а в программе - другой. Зачем invoke, я не могу понять.
Во-вторых, неправильно писать public static int Randomizer() => new Random().Next(1, 10). Необходимо создать статическое поле, которое инициализировать генератором. Далле в методе просто возвращать следующее значение: public static int Randomizer() => rand.Next(1, 10)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы