Поменяйте местами две переменные без использования временной переменной - PullRequest
58 голосов
/ 30 апреля 2009

Я бы хотел иметь возможность поменять две переменные без использования временной переменной в C #. Можно ли это сделать?

decimal startAngle = Convert.ToDecimal(159.9);
decimal stopAngle = Convert.ToDecimal(355.87);

// Swap each:
//   startAngle becomes: 355.87
//   stopAngle becomes: 159.9

Ответы [ 28 ]

6 голосов
/ 30 июля 2013

Если вы можете перейти с decimal на double, вы можете использовать класс Interlocked. Предположительно, это будет хорошим способом изменения производительности переменных. Также немного более читабельно, чем XOR.

var startAngle = 159.9d;
var stopAngle = 355.87d;
stopAngle = Interlocked.Exchange(ref startAngle, stopAngle);

Msdn: Interlocked.Exchange (Double, Double)

6 голосов
/ 29 сентября 2017

В C # 7:

(startAngle, stopAngle) = (stopAngle, startAngle);
5 голосов
/ 01 мая 2009

Для полноты вот бинарный XOR-своп:

int x = 42;
int y = 51236;
x ^= y;
y ^= x;
x ^= y;

Это работает для всех атомарных объектов / ссылок, так как оно имеет дело непосредственно с байтами, но может потребовать небезопасного контекста для работы с десятичными или, если вы чувствуете себя действительно искаженными, указателями. И в некоторых случаях она может быть медленнее, чем временная переменная.

5 голосов
/ 22 июля 2017

С C # 7 вы можете использовать деконструкцию кортежа для достижения желаемого свопинга в одну строку, и становится ясно, что происходит.

decimal startAngle = Convert.ToDecimal(159.9);
decimal stopAngle = Convert.ToDecimal(355.87);

(startAngle, stopAngle) = (stopAngle, startAngle);
5 голосов
/ 08 октября 2010

Остерегайтесь окружающей среды!

Например, это не похоже на работу в ECMAscript

y ^= x ^= y ^= x;

Но это делает

x ^= y ^= x; y ^= x;

Мой совет? Предположим, как можно меньше.

3 голосов
/ 05 мая 2016

Простой способ поменять 2 числа в одной строке:

a=(a+b)-(b=a);

например: a = 1, b = 2

Шаг 1: a = (1 + 2) - (b = 1)

Шаг 2: а = 3-1

=> a = 2 и b = 1


Эффективным способом является использование:

C Программирование: (x ^= y), (y ^= x), (x ^= y);

Java: x = x ^ y ^ (y = x);

Python: x, y = y, x

Примечание: Самая распространенная ошибка, которую совершают люди: // Замена с использованием побитового XOR (неправильное решение в C / C ++)

x ^= y ^= x ^= y; 

Источник: GeeksforGeek

3 голосов
/ 05 июля 2009
a = a + b
b = a - b
a = a - b

1002 *

2 голосов
/ 30 июня 2017

мы можем сделать это простым трюком

a = 20;
b = 30;
a = a+b; // add both the number now a has value 50
b = a-b; // here we are extracting one number from the sum by sub
a = a-b; // the number so obtained in above help us to fetch the alternate number from sum
System.out.print("swapped numbers are a = "+ a+"b = "+ b);
2 голосов
/ 30 апреля 2009

Для двоичных типов вы можете использовать этот прикол:

a %= b %= a %= b;

Пока a и b не являются одной и той же переменной (например, псевдонимы для одной и той же памяти), она работает.

2 голосов
/ 16 марта 2016

Надеюсь, это поможет ...

using System;

public class Program
{
    public static void Main()
    {
        int a = 1234;
        int b = 4321;

        Console.WriteLine("Before: a {0} and b {1}", a, b);

        b = b - a;
        a = a + b;
        b = a - b;

        Console.WriteLine("After: a {0} and b {1}", a, b);
    }
}
...