Создать класс агрегатор используя делегаты
нужна помощь в лабораторной работе. Я студент заочной формы обучения. Задание:
Создать класс агрегатор со следующими возможностями:
- Посчитать сумму любого количества чисел
- Посчитать произведение любого количества чисел
- Найти максимальное среди любого количества чисел
Не могу понять как именно посчитать сумму(произведение) ЛЮБОГО КОЛИЧЕСТВА чисел при помощи делегатов.
Буду благодарен любой помощи.
Ответы (3 шт):
Я бы тоже хотел посмотреть, как в этом случае могут использоваться делегаты. Нет сомнений только в том, что если речь идет о любом количестве параметров, используем params. Самому пришло в голову только такое:
int GetResult(Func<int[], int> func, params int[] numbers)
{
return func(numbers);
}
И такая функция для передачи в метод, например:
int Sum(params int[] numbers)
{
return numbers.Sum(); // Linq
}
А меня скорее смутило Создать класс агрегатор..., вероятно что-то такое должно быть
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.
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.