Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并两个整数以创建唯一的数字_C#_String_Math_Integer - Fatal编程技术网

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转换为了。