C#:数字的通用接口

2023-11-24

我正在尝试执行一些独立于数字类型的通用数字操作。但是,我知道没有办法使用泛型来做到这一点。第一个想法是使用 where 语句过滤传入类型,但所有数字类型都是封闭的,因此对于通用过滤器无效。此外,泛型不允许标准数字运算(加法、移位等),因此我能想到的唯一解决方案是以非泛型方式重写每个方法。还有其他想法吗?

作为参考,以下是我最初尝试的代码:

    private const int BYTE_SIZE = 8;

    private const int UINT16_SIZE = 16;

    private const int UINT32_SIZE = 32;

    private const int UINT64_SIZE = 64;

    public static byte[] ToBytes(UInt16[] pnaValues)
    {
        return ToSmaller<byte, UInt16>(pnaValues, BYTE_SIZE, UINT16_SIZE);
    }

    public static byte[] ToBytes(UInt32[] pnaValues)
    {
        return ToSmaller<byte, UInt32>(pnaValues, BYTE_SIZE, UINT32_SIZE);
    }

    ....

    public static UInt16[] ToUInt16s(byte[] pnaValues)
    {
        return ToLarger<UInt16, byte>(pnaValues, UINT16_SIZE, BYTE_SIZE);
    }

    public static UInt16[] ToUInt16s(UInt32[] pnaValues)
    {
        return ToSmaller<UInt16, UInt32>(pnaValues, UINT16_SIZE, UINT32_SIZE);
    }

    ...

    public static UInt64[] ToUInt64s(UInt32[] pnaValues)
    {
        return ToLarger<UInt64, UInt32>(pnaValues, UINT64_SIZE, UINT32_SIZE);
    }

    private static TLarger[] ToLarger<TLarger, TSmaller>(TSmaller[] pnaSmaller, int pnLargerSize, int pnSmallerSize)
        where TLarger : byte, UInt16, UInt32, UInt64
        where TSmaller : byte, UInt16, UInt32, UInt64
    {
        TLarger[] lnaRetVal = null;
        int lnSmallerPerLarger = pnLargerSize / pnSmallerSize;

        System.Diagnostics.Debug.Assert((pnLargerSize % pnSmallerSize) == 0);

        if (pnaSmaller != null)
        {
            System.Diagnostics.Debug.Assert((pnaSmaller % lnSmallerPerLarger) == 0);

            lnaRetVal = new TLarger[pnaSmaller.Length / lnSmallerPerLarger];

            for (int i = 0; i < lnaRetVal.Length; i++)
            {
                lnaRetVal[i] = 0;

                for (int j = 0; j < lnSmallerPerLarger; j++)
                {
                    lnaRetVal[i] = (lnaRetVal[i] << pnLargerSize) + pnaSmaller[i * lnSmallerPerLarger + j];
                }
            }
        }

        return lnaRetVal;
    }

    private static TSmaller[] ToSmaller<TSmaller, TLarger>(TLarger[] pnaLarger, int pnSmallerSize, int pnLargerSize)
        where TSmaller : byte, UInt16, UInt32, UInt64
        where TLarger : byte, UInt16, UInt32, UInt64
    {
        TSmaller[] lnaRetVal = null;
        int lnSmallerPerLarger = pnLargerSize / pnSmallerSize;

        System.Diagnostics.Debug.Assert((pnLargerSize % pnSmallerSize) == 0);

        if (pnaSmaller != null)
        {
            lnaRetVal = new TSmaller[pnaLarger.Length * lnSmallerPerLarger];

            for (int i = 0; i < lnaRetVal.Length; i++)
            {
                for (int j = 0; j < lnSmallerPerLarger; j++)
                {
                    lnaRetVal[i * lnSmallerPerLarger + (lnSmallerPerLarger - 1 - j)]
                        = pnaLarger[i] >> (j * pnLargerSize);
                }
            }
        }

        return lnaRetVal;
    }

数字类型实现的算术运算没有通用接口。通用运算符可能有助于解决您的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:数字的通用接口 的相关文章

随机推荐

  • 并发队列与GCD? (iOS 4.2.1)

    我有以下问题 dispatch queue t concurrentQueue dispatch get global queue DISPATCH QUEUE PRIORITY BACKGROUND 0UL concurrentQueue
  • 在 Keras 中使用 K.eval() 将 Tensor 转换为 np.array 返回 InvalidArgumentError

    这是为了在 Keras 中定义自定义损失函数 代码如下 from keras import backend as K from keras models import Sequential from keras layers import
  • C# Excel Interop 循环单元格时速度缓慢

    我正在尝试使用 C 从 Excel 文档中提取所有文本数据 但遇到性能问题 在下面的代码中 我打开工作簿 循环遍历所有工作表 循环遍历所使用范围中的所有单元格 同时从每个单元格中提取文本 问题是 这需要 14 秒才能执行 public cl
  • 是否可以在 Visual Studio 2010 中停止 .sql 文件的智能感知?

    我正在使用 Visual Studio 2010 在扩展名为 sql 的文件中编辑 MySQL 数据库的 DDL IDE 坚持在完全合法的 MySQL 语法下提供红色曲线 大概是因为它不是合法的 SQL Server 语法 是否可以禁用 S
  • 如何确定我的一项活动是否在前台[重复]

    这个问题在这里已经有答案了 我已经实现了一个由 AlarmManager 触发的 BroadcastReceiver AlarmManager 在 BOOT COMPLETED 时初始化 所以我必须在清单中声明接收者 我的问题是 我希望 B
  • Android - 具有自定义属性的自定义 UI

    我知道可以创建自定义 UI 元素 通过视图或特定 UI 元素扩展 但是是否可以为新创建的 UI 元素定义新的属性或属性 我的意思不是继承 而是全新定义一些我无法使用默认属性或属性处理的特定行为 例如元素我的自定义元素
  • Objective-c,如何从另一个类访问实例变量

    我习惯于用Java编程并使用类变量来访问其他类的数据 然后我发现类变量在 Obj C 中的工作方式不同 并且存在问题 我的问题是 我想在用户登录后在另一个类中访问用户输入的密码 已在不同的论坛中阅读过 因此我应该使用类方法 来访问这些数据
  • 如何检测选择器是否返回 null?

    检测 jQuery 选择器是否返回空对象的最佳方法是什么 如果你这样做 alert notAnElement 你得到 object Object 所以我现在的做法是 alert notAnElement get 0 这将写 未定义 因此您可
  • 无法在 Flask-sqlalchemy 中创建自引用外键

    我有一个模型Region和每个Region可以有子区域 每个子区域都有一个字段parent id这是其父区 域的 id 这是我的模型的样子 class Region db Model tablename regions table args
  • 当 URL 参数更改时,React 路由器 6 永远不会卸载组件

    我们的 React Router v6 遇到了问题 当URL参数改变时 它已经在使用挂载组件了 切勿拆卸和安装该组件 生成的代码示例 如果在链接 1 和链接 2 之间切换 url 参数 id 更改 则链接组件永远不会卸载和安装 https
  • 在 Go 中计算文件的硬链接

    根据FileInfo 的手册页 以下信息可用时stat 在 Go 中创建一个文件 type FileInfo interface Name string base name of the file Size int64 length in
  • Azure AD:访问令牌中缺少角色声明

    对于我的应用程序 我希望用户能够使用其 Azure 帐户登录 单点登录 我还需要一个访问令牌来访问安全后端 所以我可以同时得到id token和access token 向此 url 发出请求 https login microsofton
  • 通过移动通过散点绘制的点来对 python pyplot 进行动画处理

    我在用 Python 制作动画时遇到了麻烦 我的问题是制作沿着特定轨迹移动的 3D 点的动画 我可以通过使用动画模块并在绘图的每一帧重新制作来做到这一点 请参阅我的脚本中的第一个选项 我想只移动每帧的点位置 而不重新制作所有轴 请参阅我的脚
  • JPA 2.0(日志记录和跟踪)与 Glassfish 3.0.1 和 NetBeans 6.9.1:

    我在用JPA 2 0 EclipseLink提供者 与Glassfish v3 0 1 and NetBeans 6 9 1我无法看到 JPA 2 0 中的查询和其他日志记录信息 本质上我希望能够看到 JPA 生成的所有 SQL 语句以及其
  • 如何从打字稿中的静态函数访问非静态属性

    我在嘲笑User并且需要实现静态方法findOne这是静态的 所以我不需要扩展User在我的调用类中 export class User implements IUser constructor public name string pub
  • nginx 和 php 拒绝访问

    使用 nginx Web 服务器和 php nginx 正在工作 我看到 欢迎使用 nginx 但当我尝试访问 php 页面时 我收到 访问被拒绝 的消息 我还安装了 php fastcgi 这是我的 nginx 默认配置 redirect
  • Chrome 使用 jQuery ajax 时删除表单元素

    我在操作的 JSON 响应中返回一些简单的 HTML 标记 这是完整的响应 为了可读性添加了换行符 Success true Content r n div class r n div
  • 在 python 中的迭代器/生成器中引发异常后继续

    Python 有没有办法在迭代器 生成器抛出异常后继续迭代 就像下面的代码一样 有没有办法跳过 ZeroDivisionError 并继续循环gener 不修改run 功能 def gener a 1 2 3 4 0 5 6 7 8 0 9
  • 如何从 intelliJ IDEA 中的资源文件夹访问图像,而无需提供完整路径名

    我该如何在intelliJ IDEA中做这样的事情 File file new File C Users Account Documents ProjectFolder ResourceFolder image 但不必输入整个文件路径 我很
  • C#:数字的通用接口

    我正在尝试执行一些独立于数字类型的通用数字操作 但是 我知道没有办法使用泛型来做到这一点 第一个想法是使用 where 语句过滤传入类型 但所有数字类型都是封闭的 因此对于通用过滤器无效 此外 泛型不允许标准数字运算 加法 移位等 因此我能