【发布时间】:2013-09-28 12:22:14
【问题描述】:
我需要编写一个我称之为聚合容器的东西,它存储聚合,这些聚合本质上是采用对象集合并输出单个对象作为结果的操作。聚合的示例包括:算术平均值、一组数字的中值、调和平均值等。这是一个示例代码。
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是数字的集合吗?”。您可以尝试为不同的数字类型提供Action的强类型变体,或者在arg上进行运行时强制转换。 -
乔恩,谢谢你的回复。我知道,我给出的例子都是数字的……但我真的很想写一些更通用和有用的东西。我不想在那里写一堆运行时强制转换,但我建议一组具有不同类型参数的动作在这里工作......
-
看看 Enumerable 方法 - 它有一组泛型方法参数化了它支持的每种类型:
Sum<int>, Sum<double>, Sum<decimal>, Sum<Nullable<int>>等。这是使类型参数成为“summable”的唯一方法 -
这取决于你的目标。如果您假设
arg必须只包含数字 - 尝试将您的 arg 转换为 IEnumerable。如果出现非数字值,您应该抛出 ArgumentException。 -
@lazyberezovsky +1,虽然我认为这里真正的问题不是如何求和,而是
Action的签名将支持传播类型。
标签: c# .net interface aggregation