Создать класс агрегатор используя делегаты

нужна помощь в лабораторной работе. Я студент заочной формы обучения. Задание:

Создать класс агрегатор со следующими возможностями:

  1. Посчитать сумму любого количества чисел
  2. Посчитать произведение любого количества чисел
  3. Найти максимальное среди любого количества чисел

Не могу понять как именно посчитать сумму(произведение) ЛЮБОГО КОЛИЧЕСТВА чисел при помощи делегатов.
Буду благодарен любой помощи.


Ответы (3 шт):

Автор решения: ItsOK

Я бы тоже хотел посмотреть, как в этом случае могут использоваться делегаты. Нет сомнений только в том, что если речь идет о любом количестве параметров, используем params. Самому пришло в голову только такое:

int GetResult(Func<int[], int> func, params int[] numbers)
{
    return func(numbers);
}

И такая функция для передачи в метод, например:

int Sum(params int[] numbers)
{
    return numbers.Sum(); // Linq
}
→ Ссылка
Автор решения: Bulson

А меня скорее смутило Создать класс агрегатор..., вероятно что-то такое должно быть

class NumericalOperations
{
    private readonly Dictionary<string, Func<List<int>, int>> _operations;

    public NumericalOperations(Dictionary<string, Func<List<int>, int>> operations)
    {
        _operations = operations;
    }

    public Dictionary<string, int> GetOperationResults(params int[] numbers)
    {
        return GetOperationResults(numbers.ToList());
    }

    public Dictionary<string, int> GetOperationResults(List<int> numbers)
    {
        var result = new Dictionary<string, int>();
        foreach (var item in _operations)
        {
            result.Add(item.Key, item.Value.Invoke(numbers));
        }

        return result;
    }
}

class Program
{
    static void Main(string[] args)
    {
        var ops = new Dictionary<string, Func<List<int>, int>>
        {
            ["Сумма"] = ns => ns.Sum(),
            ["Произведение"] = ns => ns.Aggregate((n1, n2) => n1 * n2),
            ["Максимальное"] = ns => ns.Max()
        };

        var numsOps = new NumericalOperations(ops);

        var nums = new List<int> { 5, 10, 54, 12, 23};
        var results = numsOps.GetOperationResults(nums);

        foreach (var result in results)
        {
            Console.WriteLine($"{result.Key} = {result.Value}");
        }

        Console.ReadLine();
    }

}

Да, и при вычислении произведения очень быстро возникает переполнение, так что вероятно надо бы использовать вместо int, например decimal.

→ Ссылка
Автор решения: Qwertiy

https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs

public static int Sum(this IEnumerable<int> source) {
    if (source == null) throw Error.ArgumentNull("source");
    int sum = 0;
    checked {
        foreach (int v in source) sum += v;
    }
    return sum;
}

Если надо параметрами, используй params.

→ Ссылка