2012-07-04 14 views
7

Tengo dos enteros, ej. 15 y 6, y quiero conseguir 156. Lo que hago:¿Una buena forma de "agregar" enteros en C#?

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

Cualquier forma mejor de hacer esto?

ACTUALIZACIÓN: Gracias por todas sus buenas respuestas. Corro una prueba Cronómetro rápido para ver cuáles son las implicaciones de rendimiento: Este es un código probado en mi máquina:

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); 
    } 

Y aquí está el calendario:

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 proporciona una muy agradable y elegante solución y Chris Gessler proporcionó un método de extensión muy agradable para esa solución.

+0

¿Por qué necesitarías una mejor manera si esa manera funciona y es rápida? – 3aw5TZetdf

+0

toString() no es necesario ya que hay una concatenación – Shyju

+0

Estaba pensando que hay una forma integrada de hacerlo con int tipo de datos como cambios o algo similar – user194076

Respuesta

16

Puede hacerlo numéricamente. Sin conversión de cadenas necesario:

int i=15; 
int j=6; 

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

o:

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

A menos que haya una razón en particular, que pueda haber, para "necesitar" más rápido ", solo usaría una variación de la cadena concat .. pero +1 para un enfoque diferente. –

+0

+1 Me pregunto si es más rápido que @ dasblinkenlight's 'string' approach? a nadie le importa publicar el resultado de la prueba FSAG (por cosas tontas y risitas) ... – xandercoded

+3

@Xander Evita gran parte de las mismas operaciones matemáticas (y gastos indirectos adicionales y cadenas intermedias) incluidas en el BCL para los pasos de conversión; Esperaría que ganara un micro cualquier día. Por supuesto, un micro es un micro ... y yo aceptaría este código * solo * detrás de una función con nombre adecuado (o un caso de rendimiento de referencia muy particular). –

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

Esta respuesta asume que la variable j es menor que 10. –

3

He aquí un método de extensión:

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; 
    } 
} 

Y utilizarlo:

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

Si usa el método más basado en números, será más rápido (y más puro) usar '(int) Math.Log10 (i) + 1' en lugar de' i.ToString(). Length' (como visto en la respuesta de Pent Ploompuu) ... –

+0

@SimonMcKenzie - actualizado. –

+0

Guau, cuando veo la multiplicación por diez codificada como '((p << 2) + p) << 1', puedo decir que el autor tiene una experiencia considerable en programación en lenguaje ensamblador :) Dejé de usar este truco hace unas dos décadas Hace mucho tiempo, después de ver un compilador de C de optimización para una CPU de 8 bits, compila la multiplicación por constantes en una serie de cambios y adiciones. – dasblinkenlight

Cuestiones relacionadas