看看以下程序:
class Test
{
List<int> myList = new List<int>();
public void TestMethod()
{
myList.Add(100);
myList.Add(50);
myList.Add(10);
ChangeList(myList);
foreach (int i in myList)
{
Console.WriteLine(i);
}
}
private void ChangeList(List<int> myList)
{
myList.Sort();
List<int> myList2 = new List<int>();
myList2.Add(3);
myList2.Add(4);
myList = myList2;
}
}
Run Code Online (Sandbox Code Playgroud)
我假设myList已经过去了ref,输出会
3
4
Run Code Online (Sandbox Code Playgroud)
该列表确实"通过ref传递",但只有该sort函数生效.以下声明myList = myList2;无效.
所以输出实际上是:
10
50
100
Run Code Online (Sandbox Code Playgroud)
你能帮我解释一下这个行为吗?如果确实myList没有通过ref(因为它看起来myList = myList2没有生效),如何myList.Sort()生效?
我甚至假设该语句不生效,输出为:
100
50
10
Run Code Online (Sandbox Code Playgroud) 我已经尝试了一整天,似乎无法找出它为什么不起作用.我认为问题在于我使用JavaScript语言的技巧.我可能会错过一些关于参数传递的概念.你能告诉我错误在哪里吗?
这是我的实现,基于我一年前在C#中编写的另一个实现,可以在这里找到.
所以这里是代码(您可以直接在Chromes控制台上尝试,只需复制/粘贴它就会"工作"):
function merge(A, p, q, r){
var n1 = q - p + 1;
var n2 = r - q;
var i = 0;
var j = 0;
var L = [];
while (i < n1){
L.push(A[p + i++]);
}
var R = [];
while(j < n2){
R.push(A[q + j++ + 1]);
}
L.push(Number.MAX_VALUE);
R.push(Number.MAX_VALUE);
i = 0;
j = 0;
var k = p;
while(k <= r){
if(L[i] <= R[i]){
A[k] = L[i];
i = …Run Code Online (Sandbox Code Playgroud)