Intercambiar valores de variables sin el uso de variables temporales en C#

Bilal Shahid 12 octubre 2023
  1. Usar Asignación de Tuplas en C#
  2. Use el operador + para sortear la variable temporal utilizada en C#
  3. Utilice una función para intercambiar valores en lugar de una implementación explícita para ocultar el uso de variables temporales en C#
  4. Cómo utilizar el operador XOR para intercambiar en C#
Intercambiar valores de variables sin el uso de variables temporales en C#

Entonces, digamos que está escribiendo un código ahora y desea intercambiar valores de variables. Probablemente harás algo como esto:

using System;

public class Program
{
  public static void Main(string[] args)
  {
      var val_one = 123;
      var val_two = 234;

      var val_swap = val_one;
      val_one = val_two;
      val_two = val_swap;

      Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);
  }
}

Ahora aquí, primero crea una variable temporal llamada val_swap, luego copia el valor val_one para que después de modificar el valor val_one, pueda copiar fácilmente el valor original val_one nuevamente en val_two asignándole el valor de val_swap.

Hoy, buscaremos eliminar el uso de esta variable temporal y realizar dicho intercambio sin ninguna otra asignación.

Usar Asignación de Tuplas en C#

Un método muy simple que ahora puede utilizar es usar una asignación TUPLE de la siguiente manera.

(val_one, val_two) = (val_two, val_one);

Console.WriteLine("The value after swapping from the tuple method is: " + val_one + " and -> " +
                  val_two);

Producción :

The value after swapping from the tuple method is: 234 and -> 123

Este método también se ha utilizado en Python; sin embargo, no está sujeto a tuplas.

Sin embargo, a veces tienes que usar trucos para conseguir lo que quieres. Veamos un ejemplo a continuación.

Use el operador + para sortear la variable temporal utilizada en C#

Digamos que tenemos dos números; 7 y 9. La primera variable tiene el valor 7, y la segunda variable tiene el valor 9.

Si sumamos 9 a 7, obtendremos 16. Ahora asignemos 16 a la primera variable.

Para poner 9 como valor de la primera variable, hay que restar el valor de 9 a la segunda variable, que quedaría como 15-9 = 7; use este valor y réstelo de 15 en la primera variable para obtener ahora el valor 9.

val_one += val_two;
val_two = val_one - val_two;
val_one = val_one - val_two;

Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

Producción :

The value after swapping is: 234 and -> 123

Puede notar cómo esto usa aritmética simple para dejar de usar variables temporales durante el intercambio. Por otro lado, esto puede volverse ineficaz si hay valores precisos muy grandes, y el uso de dicha aritmética puede resultar en la pérdida de algunos valores.

Si desea ocultar la implementación y no solo eliminar el uso de una variable temporal, puede usar algo como lo siguiente.

Utilice una función para intercambiar valores en lugar de una implementación explícita para ocultar el uso de variables temporales en C#

Puedes hacer algo de la siguiente manera.

static void swap(ref int x, ref int y) {
  var temp = x;
  x = y;
  y = temp;
}

Y luego llámalo a continuación como:

swap(ref val_one, ref val_two);
Console.WriteLine("The value after swapping is: " + val_one + " and -> " + val_two);

Producción :

The value after swapping is: 234 and -> 123

Cómo utilizar el operador XOR para intercambiar en C#

Veamos el código a continuación.

val_one ^= val_two ^= val_one ^= val_two;

Y su salida:

The value after swapping is: 0 and -> 123

Notarás que el primer valor es 0 aunque la segunda variable ahora tiene el valor de la primera variable y funciona correctamente.

Entonces, ¿cómo arreglamos esto? Primero escribamos un código de la siguiente manera.

val_one ^= val_two;
val_two ^= val_one;
val_one ^= val_two;

Y ahora la salida es:

The value after swapping is: 234 and -> 123

Entonces, ¿qué está pasando? Primero comprendamos el código dado en la primera declaración.

Eso se puede ampliar de la siguiente manera.

val_one = val_one ^ val_two;
val_two = val_two ^ val_one;
val_one = val_one ^ val_two;

Ahora puede decir que el primer código es similar al que se presenta más adelante, entonces, ¿cómo es que no funciona, pero este último funciona bien?

Un cambio en el orden de estas operaciones aritméticas puede dar resultados diferentes. En el código anterior, val_one tiene un XOR consigo mismo, por lo que el resultado es 0.

En este último, sin embargo, el orden ya está definido y los valores se calculan perfectamente, de ahí la diferencia.

Sin embargo, recuerde no usar el intercambio XOR para niveles de código más altos. No es seguro y debe conservarse como sustituto.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub