gpt4 book ai didi

c# - 聚合以及如何检查我们是否可以对对象求和

转载 作者:太空狗 更新时间:2023-10-29 21:50:31 25 4
gpt4 key购买 nike

我需要编写一个我称之为聚合容器的东西,它存储聚合,这些聚合本质上是采用对象集合并输出单个对象作为结果的操作。聚合的示例包括:算术平均值、一组数字的中值、调和平均值等。这是一个示例代码。

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 程序集中是否有某种接口(interface)?我需要 ISummable 之类的东西……还是我需要自己实现它(然后我将不得不包装所有原始类型,如 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

这是使方法参数“可求和”的唯一方法。

不幸的是,您无法使用泛型 type parameter constraint 创建一些泛型方法,这将只允许重载 +operator 的类型。 .NET 中的运算符没有限制,运算符也不能成为某些接口(interface)的一部分(因此它们是静态的)。因此,您不能对泛型变量使用运算符。

此外,如果您查看 .NET 基本类型定义,您将找不到任何可以在这里帮助您的接口(interface) - 仅实现了比较、格式化和转换:

public struct Int32 : IComparable, IFormattable, IConvertible, 
IComparable<int>, IEquatable<int>

关于c# - 聚合以及如何检查我们是否可以对对象求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com