[英]Concatenate integers in C#
Is there an inexpensive way to concatenate integers in csharp? 有没有一种廉价的方法来连接csharp中的整数?
Example: 1039 & 7056 = 10397056 示例:1039和7056 = 10397056
If you can find a situation where this is expensive enough to cause any concern, I'll be very impressed: 如果你能找到一个足以引起任何担忧的情况,我会非常感动:
int a = 1039;
int b = 7056;
int newNumber = int.Parse(a.ToString() + b.ToString())
Or, if you want it to be a little more ".NET-ish": 或者,如果你想让它更像“.NET-ish”:
int newNumber = Convert.ToInt32(string.Format("{0}{1}", a, b));
int.Parse is not an expensive operation. int.Parse 不是一个昂贵的操作。 Spend your time worrying about network I/O and O^N regexes.
花点时间担心网络I / O和O ^ N正则表达式。
Other notes: the overhead of instantiating StringBuilder means there's no point if you're only doing a few concatenations. 其他注意事项:实例化StringBuilder的开销意味着如果你只进行一些连接就没有意义。 And very importantly - if you are planning to turn this back into an integer, keep in mind it's limited to ~2,000,000,000.
而且很重要的是-如果你打算把这个回整,记住它的限制为约20亿。 Concatenating numbers gets very large very quickly, and possibly well beyond the capacity of a 32-bit int.
连接数非常快,并且可能远远超出32位int的容量。 (signed of course).
(当然签名)。
I'm a bit late at the party, but recently I had to concatenate integers. 我在派对上有点晚了,但最近我不得不连接整数。 With 0 < a,b < 10^9 it can be done quite fast.
0 <a,b <10 ^ 9可以很快完成。
static ulong concat(uint a, uint b)
{
if (b < 10U) return 10UL * a + b;
if (b < 100U) return 100UL * a + b;
if (b < 1000U) return 1000UL * a + b;
if (b < 10000U) return 10000UL * a + b;
if (b < 100000U) return 100000UL * a + b;
if (b < 1000000U) return 1000000UL * a + b;
if (b < 10000000U) return 10000000UL * a + b;
if (b < 100000000U) return 100000000UL * a + b;
return 1000000000UL * a + b;
}
Edit: the version below might be interesting (platform target: x64). 编辑:下面的版本可能很有趣(平台目标:x64)。
static ulong concat(ulong a, uint b)
{
const uint c0 = 10, c1 = 100, c2 = 1000, c3 = 10000, c4 = 100000,
c5 = 1000000, c6 = 10000000, c7 = 100000000, c8 = 1000000000;
a *= b < c0 ? c0 : b < c1 ? c1 : b < c2 ? c2 : b < c3 ? c3 :
b < c4 ? c4 : b < c5 ? c5 : b < c6 ? c6 : b < c7 ? c7 : c8;
return a + b;
}
string ConcatInt(int x,int y){return String.Format("{0}{1}",x,y);}
int ConcatInt(int x,int y){ return (x * Math.Pow(10, y.length)) + y; }
Edit Note: Fixes some mistypes. 编辑注意:修复了一些错误类型。 There are more type issues left.
还剩下更多的类型问题。 I'm just giving an outline of the answer
我只是给出答案的大纲
The second method should actually be: 第二种方法实际应该是:
static int ConcatInt2(int x, int y) {
return (int)(x * Math.Pow(10, y.ToString().Length)) + y;
}
inexpensive? 便宜? String concatenation or formatted string is probably going to be considerably faster.
字符串连接或格式化字符串可能会快得多。
Otherwise you can do something like: 否则你可以这样做:
Math.Pow(10,Math.Ceiling(Math.Log10(second)))*first+second
provided first and second are integers. 第一个和第二个是整数。 This is about the only way you'll do it not involving converting to a string and back, but I am extremely doubtful that it will be faster.
这是你要做的唯一方法,不涉及转换为字符串和返回, 但我非常怀疑它会更快。
I don't think you can get any simpler than this: 我认为你不能比这更简单:
static uint Concat (uint a, uint b)
{
uint
pow = 1;
while (pow < b)
{
pow = ((pow << 2) + pow) << 1;
a = ((a << 2) + a) << 1;
}
return a + b;
}
which has no memory allocations, string conversions or multiplies; 没有内存分配,字符串转换或乘法; or maybe:
或者可能:
static uint Concat (uint a, uint b)
{
uint
pow = 1;
while (pow < b)
{
pow = ((pow << 2) + pow) << 1;
}
return a * pow + b;
}
If you want to concatenate two binary numbers: 如果要连接两个二进制数:
static uint Concat (uint a, uint b)
{
uint
mask = uint.MaxValue;
while ((mask & b) != 0)
{
mask <<= 1;
a <<= 1;
}
return a | b;
}
If you want to concatenate many ints to a String 如果要将多个int连接到String
StringBuilder sb = new StringBuilder(1039);
sb.Append(7056);
sb.Append(1234);
sb.Append(1235);
....
sb.Append(9999);
sb.ToString();
If we want integer result then: 如果我们想要整数结果那么:
int result = int.Parse(input1.ToString() + input2.ToString());
For a string result do this: 对于字符串结果执行以下操作:
string result = input1.ToString() + input2.ToString();
The "Mathy" and "No String" method follows: “Mathy”和“No String”方法如下:
int a = 1039;
int b = 7056;
int bLen = (int)Math.Ceiling(Math.Log10(b));
int ab = (a * ((int)Math.Pow(10, bLen))) + b;
Note that it may still be slow because of the Log10 call. 请注意,由于Log10调用,它可能仍然很慢。
how about this? 这个怎么样?
int c = b;
while(c > 0) {
a *= 10;
c /= 10;
}
a += b;
Not really inpexpensive, but: 不是很贵,但是:
string con = string.Format("{0}{1}",int1,int2);
or 要么
string con = int1.ToString() + int2.ToString();
If you use this in a loop, I think I would use Option 1, which uses a StringBuilder internally. 如果你在循环中使用它,我想我会使用选项1,它在内部使用StringBuilder。
public int ConcatInts(int int1, int int2)
{
return (int)(int1 * Math.Pow(10, int2.ToString().Length)) + int2;
}
Edit: Guess I wasn't the first with this solution! 编辑:猜猜我不是第一个有这个解决方案的人!
// Concatenating two numbers program// //连接两个数字程序//
Console.WriteLine("Enter a number for a");
int a = int.Parse(Console.ReadLine());
Console.WriteLine("Enter a number for b");
int b = int.Parse(Console.ReadLine());
int Concatenating = Convert.ToInt32(string.Format("{0}{1}", a, b));
Console.WriteLine(Concatenating);
Console.ReadKey();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.