Мне нужно написать что-то, что я называю агрегирующим контейнером, в котором хранятся агрегаты, которые по существу являются действиями, которые принимают коллекцию объектов и выводят один объект в результате. Примерами агрегаций были бы: Арифметическое среднее, медианное множество чисел, гармоническое среднее и т. Д. Вот пример кода.Агрегация и как проверить, можем ли мы суммировать объекты
var arithmeticMean = new Aggregation
{
Descriptor = new AggregationDescriptor { Name = "Arithmetic Mean" },
Action = (IEnumerable arg) =>
{
double count = 0;
double sum = 0;
foreach (var item in arg)
{
sum += (double)item;
count++;
}
return sum/count;
}
};
Это моя проблема с кодом. Я предположил, что объекты были просто двойными и, следовательно, сделали преобразование. Что делать, если они не удваиваются? Как я могу убедиться, что мне разрешено суммировать два объекта? Есть ли какой-то интерфейс для этого в стандартных сборках .Net? Мне нужно что-то вроде ISummable ... Или мне нужно реализовать его самостоятельно (тогда мне придется обернуть все примитивные типы, такие как double, int и т. Д., Чтобы поддерживать его).
Любой совет, касающийся дизайна такой функциональности, будет полезен.
Проблема не что вы необходимо определить, является ли коллекция «суммируемой». Все числовые значения по существу суммируются. Вместо этого вы должны задать вопрос: «Является ли' arg' набором чисел? ». Вы можете попробовать либо предоставить строго типизированные вариации «Действие» для разных числовых типов, либо время выполнения на «arg». – Jon
Джон, спасибо за ответ. Я знаю, примеры, которые я дал, являются числовыми ... Но я бы очень хотел написать что-то более общее и полезное. Я бы не хотел писать кучу запусков, но я предлагаю, что здесь будет работать набор действий с различными типами аргументов ... –
Посмотрите на Enumerable methods - у него есть набор общих методов, параметризованных с каждым типом поддерживает: 'Sum, Sum , Sum , Sum >' и т. д. Это единственный способ сделать параметр типа «суммируемым» –