聚合以及如何检查我们是否可以对对象求和
本文关键字:是否 我们 对象 求和 何检查 检查 | 更新日期: 2023-09-27 18:32:22
我需要写一些我称之为聚合容器的东西,它存储聚合,聚合本质上是接受对象集合并输出单个对象的操作。聚合的例子是:算术平均值、一组数字的中位数、调和平均值等。下面是一个示例代码。
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 程序集中是否有某种接口?我需要类似的东西...还是我需要自己实现它(然后我将不得不包装所有原始类型,如 double、int 等来支持它)。
有关此类功能设计的任何建议都将有所帮助。
看看Enumerable
类方法 - 它有一组方法,它支持每种类型都参数化:
int Sum(this IEnumerable<int> source)
double Sum(this IEnumerable<double> source)
decimal Sum(this IEnumerable<decimal> source)
long Sum(this IEnumerable<long> source)
int? Sum(this IEnumerable<int?> source)
// etc
这是使方法参数"可求和"的唯一方法。
遗憾的是,您无法创建一些具有泛型类型参数约束的泛型方法,这将只允许具有 +运算符重载的类型。在 .NET 中对运算符没有约束,运算符也不能是某些接口的一部分(因此它们是静态的)。因此,不能将运算符与泛型类型的变量一起使用。
此外,如果您查看 .NET 基元类型定义,您将找不到任何可以帮助您的接口 - 仅实现了比较、格式化和转换:
public struct Int32 : IComparable, IFormattable, IConvertible,
IComparable<int>, IEquatable<int>
您可以在类中修改 Action
属性,如下所示:
public Func<IEnumerable<double>, double> Action { get; set; }
因此,它只会IEnumerable<double>
并返回double
结果。