2012-07-04 14 views
7

Ich habe zwei ganze Zahlen, ex. 15 und 6, und ich möchte bekommen 156. Was ich mache:Guter Weg, ganze Zahlen in C# "anzufügen"?

int i = 15; 
int j = 6; 
Convert.ToInt32(i.ToString() + j.ToString()); 

einen besseren Weg, dies zu tun?

UPDATE: Vielen Dank für Ihre netten Antworten. Ich betreibe eine schnelle Stoppuhr-Test, um zu sehen, was die Auswirkungen auf die Leistung sind: Dies ist ein Code auf meinem Rechner getestet ist:

static void Main() 
    { 
     const int LOOP = 10000000; 
     int a = 16; 
     int b = 5; 
     int result = 0; 
     Stopwatch sw = Stopwatch.StartNew(); 
     for (int i = 0; i < LOOP; i++) 
     { 
      result = AppendIntegers3(a, b); 
     } 
     sw.Stop(); 
     Console.WriteLine("{0}ms, LastResult({1})", sw.ElapsedMilliseconds,result); 
    } 

Und hier ist das Timing:

My original attempt: ~3700ms 
Guffa 1st answer: ~105ms 
Guffa 2nd answer: ~110ms 
Pent Ploompuu answer: ~990ms 
shenhengbin answer: ~3830ms 
dasblinkenlight answer: ~3800ms 
Chris Gessler answer: ~105ms 

Guffa bot eine sehr schöne und intelligente Lösung und Chris Gessler bot eine sehr schöne Erweiterungsmethode für diese Lösung.

+0

Warum würden Sie eine bessere Art und Weise müssen, wenn auf diese Weise funktioniert und schnell ist? – 3aw5TZetdf

+0

toString() ist nicht erforderlich, da es eine Verkettung ist – Shyju

+0

Ich dachte, es gibt eine eingebaute Möglichkeit, es mit int-Datentyp wie Verschieben oder etwas ähnliches – user194076

Antwort

16

Sie können es numerisch tun. Keine String-Konvertierung erforderlich:

int i=15; 
int j=6; 

int c = 1; 
while (c <= j) { 
    i *= 10; 
    c *= 10; 
} 
int result = i + j; 

oder:

int c = 1; 
while (c <= j) c *= 10; 
int result = i * c + j; 
+1

Es sei denn, es einen bestimmten Grund war - was es sein kann - für „benötigen schneller ", würde ich nur eine Variante der Zeichenkette concat verwenden. Aber +1 für einen anderen Ansatz. –

+0

+1 ich frage mich, ob es schneller ist als @ dasblinkenlight '' string' 'Ansatz? irgendwen Prüfergebnis FSAG schreiben (für Scheiße und kichert) ... – xandercoded

+3

@Xander Es viel von der gleichen Mathematik vermeidet (und zusätzlichen Aufwand und Zwischen strings) für die Umwandlungsschritte in der BCL gewickelt; Ich würde erwarten, dass es an einem beliebigen Tag einen Mikro gewinnt. Natürlich ist ein Mikro ein Mikro .. und ich würde diesen Code * nur * hinter einer apt-named-Funktion (oder einem ganz bestimmten Benchmark-Performance-Fall) akzeptieren. –

2
int res = j == 0 ? i : i * (int)Math.Pow(10, (int)Math.Log10(j) + 1) + j; 
-2
int i=15 
int j=6 
int result=i*10+6; 
+3

Diese Antwort setzt voraus, dass die j-Variable kleiner als 10 ist. –

3

Hier ist eine Erweiterung Methode:

public static class Extensions 
{ 
    public static int Append(this int n, int i) 
    { 
     int c = 1; 
     while (c <= i) c *= 10; 
     return n * c + i; 
    } 
} 

Und es zu verwenden:

int x = 123; 
    int y = x.Append(4).Append(5).Append(6).Append(789); 
    Console.WriteLine(y); 
+0

Wenn Sie den auf mehr Zahlen basierenden Ansatz verwenden, ist es schneller (und reiner), "(int) Math.Log10 (i) + 1" anstelle von "i.ToString(). Length" (als in Pent Ploompuus Antwort gesehen) ... –

+0

@SimonMcKenzie - aktualisiert. –

+0

Wow, wenn ich die Multiplikation mit zehn als '((p << 2) + p) << 1' codiert sehe, kann ich sagen, dass der Autor beträchtliche Erfahrung in der Assembler-Programmierung hat :) Ich habe diesen Trick über zwei Jahrzehnte aufgehört Nachdem wir einen optimierenden C-Compiler für eine 8-Bit-CPU gesehen haben, kompilieren wir die Multiplikation mit der Konstanten in eine Reihe von Verschiebungen und Additionen. – dasblinkenlight

0

würde ich gerne nutzen string.Concat(i,j)