在数组中交换2个元素的功能不起作用

时间:2013-05-11 18:16:52

标签: c# swap

我是C#的新手,我无法理解为什么这段代码不起作用。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            char[] sw = "ab".ToCharArray();
            swap(sw[0], sw[1]);
            string end = new string(sw);
            Console.Write(end);
        }

        static void swap(char a, char b)
        {
            char temp = a;
            a = b;
            b = temp;
        }
    }
}

我在控制台上的期望是“ba”,但我得到“ab”。我能够找到解决这个问题的不同方法,但我想知道的是这段代码中的错误是什么。 谢谢你的帮助!

5 个答案:

答案 0 :(得分:11)

问题是swap方法实际上只是操纵ab的本地副本。您需要通过引用传递参数。因此,您可以像这样定义swap方法:

    static void swap(ref char a, ref char b)
    {
        char temp = a;
        a = b;
        b = temp;
    }

并称之为:

    swap(ref sw[0], ref sw[1]);

答案 1 :(得分:2)

应该像下面这样修改它(注意:在这个例子中,ref char[] arrref为前缀,主要用于说明目的:默认情况下,数组将由ref传递

namespace ConsoleApplication1
{

        class Program
        {
            static void Main(string[] args)
            {
                char[] sw = "ab".ToCharArray();
                swap(0, 1, ref sw );
                string end = new string(sw);
                Console.Write(end);
            }

            static void swap(int indexA, int indexB, ref char[] arr)
            {
                char temp = arr[indexA];
                arr[indexA] = arr[indexB];
                arr[indexB] =temp;
            }
        }
    }

答案 2 :(得分:1)

您的交换采用两种值类型并在变量之间交换值。那里没有什么可以修改原始数组。您需要将交换方法修改为:

static void Swap(char[] array, int a, int b)
{
    char temp = array[a];
    array[a] = array[b];
    array[b] = temp;
}

然后你可以从Main()调用它,如:

Swap(array, 0, 1);

答案 3 :(得分:1)

更通用的数组交换函数:

    public static void Swap<T>(this T[] array, int indexA, int indexB)
    {
        T temp        = array[indexA];
        array[indexA] = array[indexB];
        array[indexB] = temp;
    }

还有一个通用函数,用于交换多个数组元素:

    public static void Swap<T>(this T[] array, int indexA, int indexB, int length)
    {
        while (length-- > 0)
            Swap(array, indexA++, indexB++);
    }

答案 4 :(得分:0)

您正在通过值传递论据ab
有关详细信息,请参阅What's the difference between passing by reference vs. passing by value?

以下是解决问题的两种解决方案。

//Pass by value and return the values
static Tuple<char, char> swap2(char a, char b)
{
    char temp = a;
    a = b;
    b = temp;
    return new Tuple<char, char>(a, b);
}

//Pass by reference
static void swap3(ref char a, ref char b)
{
    char temp = a;
    a = b;
    b = temp;
}

public static void Main(string[] args)
{
    char[] sw2 = "ab".ToCharArray();
    var chars2 = swap2(sw2[0], sw2[1]);
    sw2[0] = chars2.Item1;
    sw2[1] = chars2.Item2;
    //Will print "ba"
    Console.WriteLine(sw2);

    char[] sw3 = "ab".ToCharArray();
    swap3(ref sw3[0], ref sw3[1]);
    //Will print "ba"
    Console.WriteLine(sw3);
}

以下是关于您是应该使用还是尝试避免使用ref关键字的问题。除了最简单的用途之外,通常建议尽可能避免引用。交换属于“最简单的用途”类别,但我建议您在大多数实际情况下尽量避免使用ref。
When is using the C# ref keyword ever a good idea?