List转DataTable

一、简单讲解

结合图片简单讲解DataTable几个比较重要的属性以便于更好的理解代码。

     

Table:表示一个表;
Rows:表行的集合;
Columns:表列的集合;

单元格是表格中行与列的交叉部分;

Rows[index]:index代表下标,从0开始;可以定位到第几行。

比如

Rows[0],代表第一行;

Rows[1],代表第二行;

Columns[index]:index代表下标,从0开始;可以定位到第几列。

Columns[0],代表第一列;

Columns[1],代表第二列;

 

想要获取到第几行第几列的数据我们有两种方法:

1) rows[行数][列数];

2) rows[行数][列名];

 

按照上图一的标记

想要获取标记为①的单元格值103

var value = rows[3][3]; 第4行第4列单元格值:

var value= rows[3]["MemberId"];第4行列名为MemberId的单元格值:

 

想要获取标记为②的单元格值CS202206271430001:

var value = rows[1][7]; 第2行第8列单元格值:

var value= rows[1]["UsageBillNo"];第2行列名为UsageBillNo的单元格值: 

二、List转DataTable 代码如下 

        /// <summary>
        /// 测试入口
        /// 模拟数据
        /// </summary>
        /// <returns></returns>
        public DataTable ListToDataTableTest() {

             var couponUsageList = new List<CrmCouponTestDto>() {
                 new CrmCouponTestDto {
                     Id=1,
                     CouponCode="test001",
                     CouponId = 1,
                     MemberId=100,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),
                     UsageShopId=0,
                     UsageBillNo="",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=0
                 },
                 new CrmCouponTestDto {
                     Id=2,
                     CouponCode="test002",
                     CouponId = 1,
                       MemberId=101,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("2022-06-27 14:30:00"),
                     UsageShopId=2,
                     UsageBillNo="CS202206271430001",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=1
                 },
                  new CrmCouponTestDto {
                     Id=3,
                     CouponCode="test003",
                     CouponId = 1,
                     MemberId=102,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),
                     UsageShopId=0,
                     UsageBillNo="",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=0
                 },
                    new CrmCouponTestDto {
                     Id=4,
                     CouponCode="test004",
                     CouponId = 1,
                     MemberId=103,
                     IssueTime=Convert.ToDateTime("2022-06-27 14:00:00"),
                     UsageTime=Convert.ToDateTime("3000-12-31 00:00:00"),
                     UsageShopId=0,
                     UsageBillNo="",
                     EffectiveStart=Convert.ToDateTime("2022-06-27 14:00:00"),
                     EffectiveEnd=Convert.ToDateTime("2023-06-27 14:00:00"),
                     Status=0
                 }
             };
             return ListToDataTable<CrmCouponTestDto>(couponUsageList);

        }

        /// <summary>
        /// 将List转化为DataTable核心方法
        /// </summary>
        /// <returns></returns>
        public DataTable ListToDataTable<T>(List<T> data)
        {
            #region 创建一个DataTable,以实体名称作为DataTable名称

            var tableName = typeof(T).Name;
            DataTable dt = new DataTable
            {
                TableName = tableName
            };

            #endregion

            #region 拿取列名,以实体的属性名作为列名       
                               
            var properties = typeof(T).GetProperties();
            foreach (var item in properties)
            {
                var curFileName = item.Name;
                dt.Columns.Add(curFileName);
            }

            #endregion

            #region 列赋值
            foreach (var item in data)
            {
                DataRow dr = dt.NewRow();
                var columns = dt.Columns;

                var curPropertyList=item.GetType().GetProperties();
                foreach (var p in curPropertyList)
                {  
                    var name = p.Name;                                
                    var curValue = p.GetValue(item);
                 
                    int i = columns.IndexOf(name);
                    dr[i] = curValue;
                }

                dt.Rows.Add(dr);
            }

            #endregion  

            return dt;
        }


  /// <summary>
    /// 实体
    /// </summary>
    public  class CrmCouponTestDto
    {
        /// <summary>
        /// ID
        /// </summary>
        public long  Id { get; set; }

        /// <summary>
        /// 卡券号
        /// </summary>     
        public string CouponCode { get; set; }

        /// <summary>
        /// 卡券ID
        /// </summary>
        public int CouponId { get; set; }

        /// <summary>
        /// 会员ID
        /// </summary>
        public int MemberId { get; set; }

        /// <summary>
        /// 发放时间
        /// </summary>   
        public DateTime IssueTime { get; set; }

        /// <summary>
        /// 使用时间
        /// </summary>      
        public DateTime UsageTime { get; set; }

        /// <summary>
        /// 使用店铺ID
        /// </summary>      

        public int UsageShopId { get; set; }

        /// <summary>
        /// 使用单号
        /// </summary>      
        public string UsageBillNo { get; set; }

        /// <summary>
        /// 有效开始时间
        /// </summary>      
        public DateTime EffectiveStart { get; set; }

        /// <summary>
        /// 有效结束时间
        /// </summary>      
        public DateTime EffectiveEnd { get; set; }

        /// <summary>
        /// 状态
        /// CouponStatus 卡券状态:
        /// -1:未领用
        /// 0:未使用
        /// 1:已使用
        /// 2:已过期
        ///3:已作废
        ///4:转赠中
        /// </summary>
    
        public Int16 Status { get; set; }
    }
View Code

  

本文转载于网络 如有侵权请联系删除

相关文章

  • MATLAB画图使用不同的颜色

    大家好,又见面了,我是你们的朋友全栈君。1.自动使用不同的颜色plot(x1,y2,x2,y2,x3,y3,...);复制此方法比较简单,能满足一般需要。但默认只能在7种颜色之间循环,具体的颜色可通过以下命令查看get(gca,'ColorOrder')复制具体实例:x1=linspace(1,10,100); y1=sin(x1); y2=cos(x1); y3=1./(x1); plot(x1,y1,x1,y2,x1,y3);复制2.设置一个颜色rgb数组,通过循环使用不同颜色基本命令:plot(y,'color',[100]);复制具体实例:closeall; clear; clc; M=10; N=10; data=rand(M,N);%生成M组N点演示数据 color=[0000010100111001011101110.500.75.75];%自定义M组颜色 figure(1); holdon;%在同一张图上绘制 fori=1:M plot(data(i,:),'color',color(i,:)); pause(

  • 扒一扒使用boostrap-fileinput上传插件遇到的坑,Bootstrap-fileinput上传插件的使用详解,「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。由于公司项目的需求,需要实现动植物名录的添加,包括姓名等信息和图片等,需要使用bootstrap-fileinput的上传插件,在提交添加界面表单数据的同时上传一张或者多张图片,并将上传的图片保存到本地磁盘中(本文是f:盘的目录下),在在实现的时候,不适用bootstrap-fileinput上传插件本身的上传按钮(因为本身的按钮只能上传图片),需要点击提交,将表单的其他信息和图片一起提交到后台。实现思路:原来我的思路是不使用插件的上传按钮,而自己通过js将插件里面的多文件与表单一起提交,但是到后台只能获取到最后一个文件,我不是文件数组。我查了很多办法好像都没办法,后来改变思路:还是自己用js触发提交表单,只是先将表单其他数据传到后台保存返回数据库id,然后通过$(‘#add_bachPic’).fileinput(‘upload’);触发提交文件上传,并传递额外参数id,最后根据传递的额外参数,修改相应的实体类中的字段,将上传的图片的名字,修改并保存数据库的pictureurl字段中!一、先来说说bootstrap-fileinput.js这个

  • JavaWeb程序架构模式的演进

    JavaWeb程序架构模式的演进老一辈的程序员一般都经历了Web程序架构模式的演进,从最开始的在jsp或者jsp+Servlet上做开发,到后来的mvc、三层等。而现在有挺多人学完web,可能都没怎么使用过jsp或jsp+Servlet开发过项目,就直接学习使用Spring、SpringBoot或者SpringMVC等框架进行开发。如果没有经历这样一个逐步演进的过程,就很难理解框架带给了我们什么样的好处,而且开发过程中遇到问题也难以解决,更别说去学习这些框架中的源码了。学习是一个循序渐进的过程,不能急于求成,所以本文旨在简单的聊一聊Web的发展史。一、web发展简史以目前SpringBoot作为时间轴的话,web发展的过程大致可以分为以下几个阶段:1.纯jsp/jsp+Servlet/jsp+JavaBean+Servlet 2.MVC/MVP/三层架构 3.使用EJB进行分布式应用的开发,EJB是重量级框架,在使用上比较复杂和麻烦 4.由于EJB太重了,于是Spring应运而生,但是Spring在发展上越来越臃肿,所以还是有许多繁琐的配置 5.同样的由于String配置太繁琐,于是S

  • 微信开发系列之四 - 将SAP C4C的数据更改通知发送到微信公众号上

    文章系列目录Wechatdevelopmentseries1–setupyourdevelopmentenvironmentWechatdevelopmentseries2–developmentQ&AserviceusingnodejsWechatdevelopmentseries3–TriggerC4CAccountcreationinWechatappWechatdevelopmentseries4–SendC4CDatachangenotificationtoWechatappWechatdevelopmentseries5–embeddedyourUI5applicationtoWechatappWechatdevelopmentseries6–RetrieveWechatUserinfoviaoAuth2anddisplayitinUI5applicationWechatdevelopmentseries7–useRedistostoreWechatconversationhistoryWechatdevelopmentseries8–MapintegrationW

  • 学习|Android JetPack组件---ORM框架Room的使用

    导语Room持久性库在SQLite的基础上提供了一个抽象层,让用户能够在充分利用SQLite的强大功能的同时,获享更强健的数据库访问机制。Room简介Room包含3个主要组件:数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。使用@Database注释的类应满足以下条件:是扩展RoomDatabase的抽象类。在注释中添加与数据库关联的实体列表。包含具有0个参数且返回使用@Dao注释的类的抽象方法。在运行时,您可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取Database的实例。Entity:表示数据库中的表。DAO:包含用于访问数据库的方法。应用使用Room数据库来获取与该数据库关联的数据访问对象(DAO)。然后,应用使用每个DAO从数据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。最后,应用使用实体来获取和设置与数据库中的表列相对应的值。Room不同组件之间的关系图 Room使用首先把Room的组件在build.gradle中引入进来defroom_version

  • 第七章 权限管理

    第七章权限管理7.1用户使用资源限制文件Linux中,对于用户使用系统资源,如:CPU、内存、磁盘空间等,都可以做出限制,需要在相关的配置文件中做设置:vi/etc/security/limits.conf---编辑资源限制文件,可写入zhangsoftnproc70---soft设置软限制,即警告值,nproc表示该用户运行起的进程数zhanghardnproc100---hard设置硬限制,即上限最大值以上案例可以实现对用户zhang限制其运行进程的数量,到达soft软限制时,会有警报,但仍可继续使用,到达hard硬限制时,将不允许再使用了。注:该文件注释中的<item>项对可设定限制的资源项有解释。7.2文件访问权限设置7.2.1文件详细信息介绍之前我们学习过,ls–l或ll后可见到目录下文件的详细信息,那么具体这些信息都是什么呢?我们来详细介绍下:ls-l---显示目录内容的详细信息,会显示7项信息从左至右依次为:文件权限硬链接数文件的所属者(属主)文件的所属组(属组)文件大小(单位:B)上一次修改时间文件名对应下图:其中:文件权限部分由10个字符组成,意义如下:-

  • 超强攻略:浙大、北大、中科大等重点大学的课程你也可以学习啦!

    本文简介:为了减少重复劳动,让我们不再孤军奋战,来自浙江大学、北京大学等国内高校的贡献者们发起了课程资料民间整理项目。这些内容不仅是教材的电子版,也有历年试卷、复习资料、习题答案甚至选课攻略。项目一:浙大共享课程资源特点:课程全GitHub:https://github.com/QSCTech/zju-icicles内容:从数学、物理、计算机、化学和其他通识课出发介绍大量课程攻略与资料。目前包括50+的主题,如下展示了其中一些:项目二:上海交大机器学习资料特点:ML领域大量主题GitHub:https://github.com/CoolPhilChen/SJTU-Courses内容:上海交大的资源非常适合了解机器学习相关的学习内容与主题,每一个课程文件下都有PPT、参考课本、作业和笔记等。计算机CS125程序设计CS221数据结构CS222算法分析与设计CS258信息论CS385机器学习EI331信号与系统EI332计算机组成EI338计算机系统工程EI339人工智能SE305数据库技术高级算法数学MA357数理统计X071571最优化方法MA26035测度与概率论项目三:北大课程资源

  • 用自己的编程语言实现了一个网站(增强版)

    前言 前段时间在《用自己的编程语言实现了一个网站》用介绍了用GScript写的一个简单“网站”,虽然是打上引号的;页面长这样: 看起来确实非常的挫,其实之前一直也想做一个GScript的在线playground,于是国庆期间学了一点皮毛Vue加上老弟的帮忙(他是前端开发),最终完成了下面这个网站: https://gscript.crossoverjie.top/ ❤打印源码参考了:https://wa-lang.org/playground/ 在这里可以在线运行GScript代码,借助于前端的代码编辑器插件甚至还能有一些语法提示。 不过有些提示与GScript的语法不兼容,毕竟编辑器的提示是基于JavaScript的语法。 内置了几个demo,可以选择运行试试。 同时也支持查看AST树和symbol符号表。 虽然显示上还有待优化。 整个后端接口全都是用GScript原生代码编写的,所以这也算是GScript的一个实际应用案例。 代码示例 func(HttpContext)run(HttpContextctx){ stringbody=ctx.postFormV

  • Mysql的刷脏页问题

    平时的工作中,不知道你有没有遇到过这样的场景,一条SQL语句,正常执行的时候特别快,但是有时也不知道怎么回事,它就会变得特别慢,并且这样的场景很难复现,它不只随机,而且持续时间还很短。 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。 平时执行很快的更新操作,其实就是在写内存和日志,而MySQL偶尔“抖”一下的那个瞬间,可能就是在刷脏页(flush)。 那么,什么情况会引发数据库的flush过程呢? 第一种场景是InnoDB的redolog写满了,这时候系统会停止所有更新操作,把checkpoint往前推进,redolog留出空间可以继续写。 第二种场景对应的就是系统内存不足。当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘。 第三种场景对应的就是MySQL认为系统“空闲”的时候。当然,MySQL忙起来可是会很快就能把redolog 记满的,所以要合理地安排时间,即使是忙的时候,也要见缝插针地找时间,只要

  • js处理枚举

    js处理枚举 标签(空格分隔):javascriptenum Backgroud:DB中读到的status是int类型,并且做了pagination,不太好单独拎出来这个字段做枚举转换,于是考虑用js在前端做个简单处理。 采用const方式定义; 通过value获取key,或者通过key获取value; 定位获取页面上每条数据的statuscell; 获取每个cell中的值,是DB中的int类型; 通过cell中拿到的int数据,即value,拿到const中对应的key,并回写到该cell; 1.定义 <script> constStatus={ IDLE:0, INUSE:1, DOWN:2 } </script> 复制 补充:let声明的变量可以被更改,重新赋值;const声明的变量,指向memoryaddr,不可重新赋值; 2.理解针对Status的各种操作 console.log(Object.keys(ClientStatus)[0])--->'IDEL' console.log(Object.keys(ClientStatus))-

  • UML概述

      UML(UnifiedModelingLanguage)统一建模语言,是描述、构造和文档化系统制品的可视化语言,是一种图形表示法。   UML用途:UML是一种工具,主要用在我们对软件用面向对象的方法来进行分析设计(OOA/D)中。   UML应用的三种方法:   草图//这是应用UML最常用的一种方式,分析和设计过程是一个逐步细化的过程,中间会产生各种想法,画图来跟别人进行沟通讨论,期间会产生很多草图。可以随时丢弃,草图用于沟通,不可能在一开始得到一个完善的设计方案;(原则上不要太细,从需要的角度出发)   蓝图//最终得到的比较完善的设计方案,我们可以基于此进行开发,但国内很多公司拿到项目后分析后直接就开始开发,而在项目开发完成后,针对项目中关键部分再来画此图,为项目维护人员使用,让其了解软件的设计方案;   编程语言一般不常用(模型驱动开发,达到的效果,在图里画User,完善UserName等,通过MDA工具生成所有代码);   UML学习的三个要素:表示法、过程、工具   模型分为动态模型和静态模型。

  • centos7 vim环境优化

    centos7默认是使用vi,而不是使用vim,所以,我们需要修改一下vi的别名,并且,我们使用neovim,vi毕竟还是有很多功能比较原始 所以 yuminstallneovim-ycat>>~/.bashrc<<EOF aliasvi='nvim' EOF复制 插件不能少,,省心点,我们用github最多星的 https://github.com/amix/vimrc 执行以下脚本,安装vim常用插件,具体插件及功能请自行看上面的链接 gitclone--depth=1https://github.com/amix/vimrc.git~/.vim_runtime sh~/.vim_runtime/install_awesome_vimrc.sh复制 neovim的vim脚本位置跟vi/vim不一样,所以,我们需要安装一下 mkdir-p~/.config/nvim cat>>~/.config/nvim/init.vim<<EOF letg:go_version_warning=0 setruntimepath+=~/.vi

  • AGC019

    质量果然挺高的。A贪心。llQ,H,S,D,N; intmain() { cin>>Q>>H>>S>>D>>N; H=min(H,Q+Q); S=min(S,H+H); D=min(D,S+S); llans=N/2*D+(N&1)*S; cout<<ans<<"\n"; }复制 B 认真目测样例可以发现答案为不相等的字符对数+1。 charstr[SZ];intn; intapp[SZ]; intmain() { scanf("%s",str+1); n=strlen(str+1); for(inti=1;i<=n;++i) ++app[str[i]]; lltot=n*(ll)(n-1)/2; for(inti='a';i<='z';++i) tot-=(app[i]-1)*ll(app[i])/2; cout<<tot+1<<"\n"; }复制 C 首先答案大体上就是曼哈顿距离*100,为了几个喷泉绕路显然不优。 每一个可以使答案变小2

  • hadoop streaming的使用

     本节我们使用C++和python实现wordcount的编写  首先我们介绍一下hadoopstreaming。   mapper和reducer会从标准输入中读取用户数据,一行一行处理后发送给标准输出。Streaming工具会创建MapReduce作业,发送给各个tasktracker,同时监控整个作业的执行过程。   如果一个文件(可执行或者脚本)作为mapper,mapper初始化时,每一个mapper任务会把该文件作为一个单独进程启动,mapper任务运行时,它把输入切分成行并把每一行提供给可执行文件进程的标准输入。同时,mapper收集可执行文件进程标准输出的内容,并把收到的每一行内容转化成key/value对,作为mapper的输出。默认情况下,一行中第一个tab之前的部分作为key,之后的(不包括tab)作为value。如果没有tab,整行作为key值,value值为null。   对于reducer,类似。(参考董的博客)   C++代码如下:     //map端#include<iostream> #include<string> us

  • npm多版本使用

    一、安装指定版本 nvminstall10.11.0复制 二、查看已安装的版本 nvmlist复制 三、使用的版本 nvmuse10.11.0 复制   

  • 软工作业 2:时事点评——红芯软件

    一、红芯事件 8月16日,号称中国首个自主创新浏览器内核红芯浏览器被发现只是chrome浏览器换个皮。 二、我的评论 三、我赞同的评论 注释确实需要,为了方便后期的纠错和查缺,但是代码冗余度高是真的不能忍,还打着爱国的旗号,太丢人了,自己开发能废他多少钱  

  • 深入浅出进程与线程的基本概念

    最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。 1. 计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。 2. 假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。 3. 进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。 4. 一个车间里,可以有很多工人。他们协同完成一个任务。 5. 线程就好比车间里的工人。一个进程可以包括多个线程。 6. 车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。 7. 可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。 8. 一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫

  • 【java】如何对Excel中为空的单元格做判断

    当我们对单元格做操作时,经常需要面对单元格有可能为空的情况。   //判断单元格是否为空或者没有数据publicbooleanisCellEmpty(XSSFCellcell){ if(cell==null||cell.getCellType()==Cell.CELL_TYPE_BLANK){ //为空时返回true returntrue; } else{ //不为空时返回false returnfalse; } 可以创建这个方法。来判断单元格是否为空。然后在进行下一步操作

  • python eval, exec. compile

    compile编译某段代码,(将一个字符串编译为字节代码),以方便重复调用.    exec可以理解为和if,for一样是一个语法声明,而不是一个函数.注意globals和locals的含义.  referto: http://www.cnblogs.com/yyds/p/6276746.html  

  • 分享朋友圈功能测试

    之前为了把小程序分享到朋友圈很费劲,通常做法是用canvas绘制一张带小程序码的图,让用户先下载下来在手动分享到朋友圈,这样确实很费劲。现在小程序开放了beta版版本分享到朋友圈功能,体验了下不得不说比上面那种做法方便得多了。那么如何实现,请按照下面的步骤进行: 1.页面需设置允许“发送给朋友” onShareAppMessage:function(){ return{ title:'发送给好友', desc:'描述描述', path:'page/plug/plug' } }, 复制 2.页面需设置允许“分享到朋友圈”,同时可自定义标题、分享图等 onShareTimeline(){ return{ title:'分享朋友圈功能测试', query:'a=1&b=2', imageUrl:'../../images/qr.jpg' } },复制 这两步设置后,用真机测试结果:                    此功能注意点:    1.从基础库2.11.3开始支持,此功能为beta版,暂

  • 题解[省选联考 2020 A 卷] 作业题

    反演+矩阵树 首先题目要求的是\(\sum\limits_{T}\sum\limits_{i=1}^{n-1}w_{e_{i}}\timesgcd(w_{e_1},...,w_{e_{n-1}})\) 很明显的可以用反演,也可以直接套\(\phi*1=id\) 那么就可以得出\(\sum\limits_{d=1}^{max(w)}\phi(d)\sum\limits_{T}^{d|(gcd(w_{e\inT}))}\sum\limits_{i=1}^{n-1}w_{e_i}\) 后面部分需要用到矩阵树定理,但矩阵树求得是\(\sum\limits_T\prod\limits_{i=1}^{n-1}w_{e_i}\),和上面的不一样,所以需要稍作转换 考虑将边权用一个一次函数\(wx+1\)表示,在模\(x^2\)下作乘法,那么你会发现一次项系数就是边权和 所以不妨定义一个多项式四则运算,加减直接对应加减就行了 乘法\((ax+b)(cx+d)=(ad+bc)x+bd\) 除法,考虑\((cx+d)\)的逆元,即我们需要求\((Ax+B)(cx+d)\equiv1(mod~x^2)\)

相关推荐

推荐阅读