Muszę napisać coś, co nazywam Zbiornikiem agregacji, który przechowuje Agregacje, które są w zasadzie Czynnościami, które pobierają kolekcję obiektów i wyprowadzają jako wynik pojedynczy obiekt. Przykładami Agregacji byłyby: Średnia arytmetyczna, Mediana zbioru liczb, Średnia harmoniczna itd. Oto przykładowy kod.Agregacja i jak sprawdzić, czy możemy zsumować obiekty
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;
}
};
Oto mój problem z kodem. Przyjąłem, że obiekty były po prostu podwójne i dlatego dokonały konwersji. Co jeśli nie są podwójne? Jak mogę się upewnić, że mogę sumować dwa obiekty? Czy istnieje jakiś interfejs do tego w standardowych złożeń .Net? Potrzebuję czegoś podobnego do "do zrobienia" ... A może sam muszę to zaimplementować (wtedy będę musiał zawijać wszystkie prymitywne typy, takie jak double, int, etcetera, aby je obsłużyć).
Wszelkie porady dotyczące projektowania takich funkcji będą pomocne.
Problemem nie jest to, że ciebie trzeba ustalić, czy kolekcja jest "podsumowująca". Wszystkie wartości liczbowe są z natury sumowane. Pytanie, które powinieneś zadać, brzmi "Czy' arg' to zbiór liczb? ". Możesz spróbować albo zapewnić silnie typowane odmiany 'Action' dla różnych typów liczbowych, albo środowisko wykonawcze rzuca na' arg'. – Jon
Jon, dziękuję za odpowiedź. Wiem, że podane przeze mnie przykłady są liczbowe ... Ale naprawdę chciałbym napisać coś bardziej ogólnego i użytecznego. Nie chciałbym napisać kilka rzutów w środowisku wykonawczym, ale proponuję, aby działał z różnymi typami argumentów ... –
Zobacz metody numerowane - ma zestaw ogólnych metod parametryzowanych z każdym typem obsługuje: 'Suma, Suma , Suma , Suma >' itp. Jest to jedyny sposób, aby parametr typu był "zsumowany" –