如何将Java"Arrays.copyOfRange"函数转换为C#?

Mil*_*t25 3 c# java arrays

使用Java中的MergeSort:

public void mergeSort(int[] A)
{
     if (A.length > 1)
     {
         int q = A.length/2;
         int[] leftArray = Arrays.copyOfRange(A, 0, q);
         int[] rightArray = Arrays.copyOfRange(A,q,A.length);
         mergeSort(leftArray);
         mergeSort(rightArray);
         merge(A,leftArray,rightArray);
     }
}
Run Code Online (Sandbox Code Playgroud)

上面代码中的递归在Java中运行良好.

因此,为了好奇,我想将函数Arrays.copyOfRange从java转换为c#.C#中的Array.copy有五个参数.你知道c#中的任何更简单的函数都会从位置x到y(比如java)开始获取数组的某些元素.

在c#中我编写了上面这样的方法:

public void mergeSort(int[] A)
{
    if (A.Length > 1)
    {
        int q = A.Length / 2;
        int[] leftArray = new int[q];
        int[] rightArray = new int[A.Length];
        for (int i = 0; i < q; i++)
        {
            leftArray[i] = A[i];
            Console.WriteLine(leftArray[i]);
        }

        for (int i = q; i < A.Length; i++)
        {
            rightArray[i] = A[i];
            Console.WriteLine(rightArray[i]);
        }
        Console.ReadKey();

        mergeSort(leftArray);
        mergeSort(rightArray);
        merge(A, leftArray, rightArray);
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已经用Java中的两个循环替换了Java中的Arrays.copyOfRange函数,这在c#中没有递归.但是,调用mergeSort(leftArray)和mergeSort(rightArray)时,它会在c#中打印出来:

由于StackOverflowException,进程终止!!

关于如何在c#中获取某些元素的任何更好的想法?

use*_*740 8

问题是移植的数组副本没有做同样的事情.

给定的输入[a,b,c,d,e,f]的Java代码创建两个阵列,[a,b,c][d,e,f]而C#端口创建两个阵列,[a,b,c][0,0,0,d,e,f].值得注意的是,

  • 新的右侧数组的大小为A(new int[A.Length]).这是导致StackOverflowException从未到达终止案例的原因,并且;
  • 新的右侧数组仅分配从q索引开始的值,即索引的中间值.

考虑这种替换方法使用Array.Copy- 具有相同签名的方法可以用作移植代码中的替换,只要该方法内部具有与原始代码相同的效果.

int[] copyOfRange (int[] src, int start, int end) {
    int len = end - start;
    int[] dest = new int[len];
    Array.Copy(src, start, dest, 0, len);
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

或者,使用循环但在原始端口中没有问题的版本.使用谨慎功能的另一个原因 - 它使任务易于查看和推理.能够消除重复的代码也不会有害.

int[] copyOfRange (int[] src, int start, int end) {
    int len = end - start;
    int[] dest = new int[len];
    // note i is always from 0
    for (int i = 0; i < len; i++)
    {
        dest[i] = src[start + i]; // so 0..n = 0+x..n+x
    }
    return dest;
}
Run Code Online (Sandbox Code Playgroud)

如果你像我一样懒,那么代码也可以使用LINQ轻松编写.

int[] leftArray = A.Take(q).ToArray();
int[] rightArray = A.Skip(q).ToArray();
Run Code Online (Sandbox Code Playgroud)