C# 合并两个整数以创建唯一的数字
早上好 我在寻找一种方法来组合两个整数来创建一个唯一的数字,我有两个表,我需要组合成第三个具有唯一数字的表 这些是我的桌子:C# 合并两个整数以创建唯一的数字,c#,string,math,integer,C#,String,Math,Integer,早上好 我在寻找一种方法来组合两个整数来创建一个唯一的数字,我有两个表,我需要组合成第三个具有唯一数字的表 这些是我的桌子: Table A SchoolID ClassId 107 56644231 107 56644532 107 320110212 Table B SchoolID ClassId 108 566442310 108 56644532 108 50110212 我需要将这些字段导出到第三个表中,该表将班级ID和学校ID合并到一个名为classID的字段中
Table A
SchoolID ClassId
107 56644231
107 56644532
107 320110212
Table B
SchoolID ClassId
108 566442310
108 56644532
108 50110212
我需要将这些字段导出到第三个表中,该表将班级ID和学校ID合并到一个名为classID的字段中。我需要能够将这些数字组合在一起,然后能够将它们取消组合,以便将schoolid和classid分开,以便进行更新。我想把字符串连接起来'schoolid++'00'++'classid'
,因为我知道schoolid永远是一个3位数的数字,但我正在寻找其他方法,也许是数学方法,我不必使用字符串强制转换
有没有数学方法可以做到这一点?或者说,用线来浇铸是最好的方法吗
我正在使用C#编写解决方案
谢谢,您表示正在使用表。这使我相信您正在数据库中工作 所以我不得不问,为什么不将它们存储在单独的列中,并使它们成为简单的外键?为什么要用一个数学方程式来连接或转换数字,从而产生歧义 如果使用另一个表,则可以使用自动递增字段,三个字段的组合(按照指定的顺序)将为您提供唯一的ID
|-------------------
| My_combine_table
|-------------------
| id | auto_inc
|-------------------
| SchoolID | ...
| SchoolID2 | ...
然后,后来:
classid = combinedid / 1000 // Integer division
schoolid = combinedid % 1000
classid = combinedid >> 8;
schoolid = combinedid & 0xFF;
如果SchoolID始终是一个3位数字,将ClassId乘以1000,然后将SchoolID相加
但是,您的号码可能会“溢出”,如果您的号码是32位的,则会溢出。我会这样组合ID:
ID = ClassID * 1000 + SchoolID
SchoolID = ID % 1000
ClassID = ID / 1000
然后,您可以按如下方式获取学校ID
:
ID = ClassID * 1000 + SchoolID
SchoolID = ID % 1000
ClassID = ID / 1000
您可以像这样获得ClassID
:
ID = ClassID * 1000 + SchoolID
SchoolID = ID % 1000
ClassID = ID / 1000
与Magnus Hoff类似,但我建议使用二进制友好方法,而不是基数为10的方法
combinedid = (classid << 8) + schoolid;
我认为从编程的角度来看这更直接一些(明确说明您的学校ID是1字节(0-255),班级ID是3字节)
您还可以使用bigint(Long/Int64)轻松实现这一点,使两个int32安全地成为一个Int64:
combinedid = ((long)classid << 32) + schoolid;
combinedid=((long)classid详细介绍了其他各种数学方法,有些方法更好。但对于您的情况,我怀疑这些方法不是什么好主意。我想您应该将这两个id保存在第三个表中,该表有自己的唯一id(主键)列。使用((a+b)(a+b+1)*0.5)+b
参考文献
注意不要创建大于存储类型最大容量的新数字。我正在导出到我无法控制的第三方系统。本地系统的设置使每个学校都有自己的数据库,因此我无法控制classid在所有数据库中都是唯一的。第三方系统没有place对于schoolId,只有ClassIDLike@JTA对这个问题发表了评论,注意没有溢出。系统需要32位整数,所以这可能是一个大问题。我没有想到这一点。谢谢你指出。我非常喜欢你的答案。谢谢。如果classid如前所述是int32,代码就不正确(classid@thomas-从技术上说你是对的。我已经更新了它,在比特转换之前很久就将classid转换为了。