C#交换两个变量值的几种方法总结

 更新时间:2022年10月22日 12:02:58   作者:Darren Ji  
这篇文章介绍了C#交换两个变量值的几种方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在学习.Net/C#或者任何一门面向对象语言的初期,大家都写过交换两个变量值,通常是通过临时变量来实现。本篇使用多种方式实现两个变量值的交换。

假设int x =1; int y = 2;现在交换两个变量的值。

使用临时变量实现

        static void Main(string[] args)
        {
            int x = 1;
            int y = 2;
            Console.WriteLine("x={0},y={1}",x, y);
            int temp = x;
            x = y;
            y = temp;
            Console.WriteLine("x={0},y={1}", x, y);
            Console.ReadKey();
        }

使用加减法实现

试想, 1+2=3,我们得到了两数相加的结果3。3-2=1,把1赋值给y,y就等于1; 3-1=2,把2赋值给x,这就完成了交换。

        static void Main(string[] args)
        {
            int x = 1;
            int y = 2;
            Console.WriteLine("x={0},y={1}",x, y);
            x = x + y; //x = 3
            y = x - y; //y = 1
            x = x - y; //x = 2 
            Console.WriteLine("x={0},y={1}", x, y);
            Console.ReadKey();
        }

使用ref和泛型方法实现

如果把交换int类型变量值的算法封装到方法中,需要用到ref关键字。

        static void Main(string[] args)
        {
            int x = 1;
            int y = 2;
            Console.WriteLine("x={0},y={1}",x, y);
            Swap(ref x, ref  y);
            Console.WriteLine("x={0},y={1}", x, y);
            Console.ReadKey();
        }
        static void Swap(ref int x, ref int y)
        {
            int temp = x;
            x = y;
            y = x;
        }

如果交换string类型的变量值,就要写一个Swap方法的重载,让其接收string类型:

        static void Main(string[] args)
        {
            string x = "hello";
            string y = "world";
            Console.WriteLine("x={0},y={1}",x, y);
            Swap(ref x, ref  y);
            Console.WriteLine("x={0},y={1}", x, y);
            Console.ReadKey();
        }
        static void Swap(ref int x, ref int y)
        {
            int temp = x;
            x = y;
            y = x;
        }
        static void Swap(ref string x, ref string y)
        {
            string temp = x;
            x = y;
            y = x;
        }

如果交换其它类型的变量值呢?我们很容易想到通过泛型方法来实现,再写一个泛型重载。

        static void Main(string[] args)
        {
            string x = "hello";
            string y = "world";
            Console.WriteLine("x={0},y={1}",x, y);
            Swap<string>(ref x, ref y);
            Console.WriteLine("x={0},y={1}", x, y);
            Console.ReadKey();
        }
        static void Swap(ref int x, ref int y)
        {
            int temp = x;
            x = y;
            y = x;
        }
        static void Swap(ref string x, ref string y)
        {
            string temp = x;
            x = y;
            y = x;
        }
        static void Swap<T>(ref T x, ref T y)
        {
            T temp = x;
            x = y;
            y = temp;
        }

使用按位异或运算符实现

对于二进制数字来说,当两个数相异的时候就为1, 即0和1异或的结果是1, 0和0,以及1和1异或的结果是0。关于异或等位运算符的介绍在这里:https://www.jb51.net/article/260847.htm

举例,把十进制的3和4转换成16位二进制分别是:

x = 0000000000000011;//对应十进制数字3
y = 0000000000000100; //对应十进制数字4

把x和y异或的结果赋值给x:x = x ^ y;
x = 0000000000000111;

把y和现在的x异或,结果赋值给y:y = y ^ x
y = 0000000000000011;

把现在的x和现在的y异或,结果赋值给x:x = x ^ y
x = 0000000000000100;

按照上面的算法,可以写成如下:

        static void Main(string[] args)
        {
            int x = 1;
            int y = 2;
            Console.WriteLine("x={0},y={1}",x, y);
            x = x ^ y;
            y = y ^ x;
            x = x ^ y;
            Console.WriteLine("x={0},y={1}", x, y);
            Console.ReadKey();
        }

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接

相关文章

  • c#中的扩展方法学习笔记

    c#中的扩展方法学习笔记

    扩展方法能够向现有类型“添加”方法,而无需创建新的派生类型,重新编译或以其他方式修改原始类型。下面这篇文章主要给大家介绍了关于c#中扩展方法学习的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2018-11-11
  • Unity实现物体跟随鼠标移动

    Unity实现物体跟随鼠标移动

    这篇文章主要为大家详细介绍了Unity实现物体跟随鼠标移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • FileShare枚举的使用小结(文件读写锁)

    FileShare枚举的使用小结(文件读写锁)

    其实/FileShare就是控制文件流的“访问权限”,当然,这仅仅是入门的文件操作,自己做了笔记,也希望能给大家带来帮助
    2014-01-01
  • C# 设计模式系列教程-桥接模式

    C# 设计模式系列教程-桥接模式

    桥接模式降低了沿着两个或多个维度扩展时的复杂度,防止类的过度膨胀,解除了两个或多个维度之间的耦合,使它们沿着各自方向变化而不互相影响。
    2016-06-06
  • C#带你玩扫雷(附源码)

    C#带你玩扫雷(附源码)

    这篇文章主要介绍了C#带你玩扫雷(附源码),详细的介绍实现扫雷的方法,具体一定的参考价值,有兴趣的可以了解一下
    2017-10-10
  • C#获取硬盘编号的方法

    C#获取硬盘编号的方法

    这篇文章主要介绍了C#获取硬盘编号的方法,涉及C#获取硬件属性的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • C#中实现深度优先搜索

    C#中实现深度优先搜索

    深度优先搜索(DFS)是一种遍历或搜索图或树的算法,广泛应用于迷宫寻路、图像处理、路径规划、模式识别、社交网络分析等领域,学习DFS有助于理解图结构,解决回溯问题,提升算法设计与分析能力,下面就来介绍一下
    2024-10-10
  • c# 如何实现图片压缩

    c# 如何实现图片压缩

    这篇文章主要介绍了c# 实现图片压缩的示例,帮助大家更好的理解和学习c#,感兴趣的朋友可以了解下
    2020-11-11
  • c#中WinForm用OpencvSharp实现ROI区域提取的示例

    c#中WinForm用OpencvSharp实现ROI区域提取的示例

    已经自学OpencvSharp一段时间了,现在就分享一下我的学习过程,本文主要介绍了c#中WinForm用OpencvSharp实现ROI区域提取的示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • C#实现查杀本地与远程进程的方法

    C#实现查杀本地与远程进程的方法

    这篇文章主要介绍了C#实现查杀本地与远程进程的方法,可实现针对特定进程的关闭操作,是C#进程操作的一个典型应用,需要的朋友可以参考下
    2014-12-12

最新评论