1) { int q -6ren">
gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:11:02 27 4
gpt4 key购买 nike

在 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);
}
}

上面代码中的递归在 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);
}
}

如您所见,我已将 Java 中的 Arrays.copyOfRange 函数替换为 c# 中的两个循环,这在 c# 中无需递归即可运行。但是调用 mergeSort(leftArray) 和 mergeSort(rightArray) 它在 c# 中打印:

进程因 StackOverflowException 而终止!!

关于如何在 C# 中获取某些元素有更好的想法吗?

最佳答案

问题是移植阵列副本做同样的事情。

给定 [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;
}

或者,一个使用循环执行但在原始端口中没有问题的版本。使用谨慎函数的另一个原因 - 它使任务易于查看和推理。能够消除重复代码也没有坏处。

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;
}

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

int[] leftArray = A.Take(q).ToArray();
int[] rightArray = A.Skip(q).ToArray();

关于c# - 如何将 Java "Arrays.copyOfRange"函数转换为 C#?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21269727/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com