传递数组然后使用OrderBy vs Sort - 更改原始数组

时间:2017-08-06 06:41:29

标签: c# arrays

为什么ArrayCalledWithOrderBy不会更改原始传递的数组,但ArrayCalledWithSort会这样做?

编辑:至于建议重复的链接。一个链接甚至没有OrderBy,所以它显然不重复。另一个链接实际上是询问哪个是OrderBy和Sort之间更好的选择,而不是为什么没有更改原始数组。

public static void ArrayCaller()
{
   var arr = new string[] { "pink", "blue", "red", "black", "aqua" };
   DisplayArray(arr, "Before method calls");

   ArrayCalledWithOrderBy(arr);
   DisplayArray(arr, "After method call using orderby");

   ArrayCalledWithSort(arr);
   DisplayArray(arr, "After method call using sort");
}

public static void ArrayCalledWithOrderBy(string[] arr)
{
    // this does not change the original array in the calling method. Why not?
    arr = (arr.OrderBy(i => i).ToArray()); 
    DisplayArray(arr, "After orderby inside method");
}

public static void ArrayCalledWithSort(string[] arr)
{
    // this changes the original array in the calling method. 
    // Because it is using the same reference? 
    // So the above code for orderby does not?
    Array.Sort(arr);
    DisplayArray(arr, "After sort inside method");
}

public static void DisplayArray(string[] arr, string msg)
{
    for (int i=0; i<arr.Length; i++)
    {
        Console.Write($"{arr[i]} ");
    }
    Console.WriteLine($" - {msg}");
} 

// OUTPUT
//pink blue red black aqua  - Before method calls
//aqua black blue pink red  - After orderby inside method
//pink blue red black aqua  - After method call using orderby
//aqua black blue pink red  - After sort inside method
//aqua black blue pink red  - After method call using sort

3 个答案:

答案 0 :(得分:3)

数组是引用类型,因此将数组传递给方法时。其引用传递。

您应该知道此方法中的arr

public static void ArrayCalledWithOrderBy(string[] arr)
{
    arr = (arr.OrderBy(i => i).ToArray()); 
    DisplayArray(arr, "After orderby inside method");
}

arr在这里:

var arr = new string [] {&#34; pink&#34;,&#34; blue&#34;,&#34; red&#34;,&#34; black&#34;,&#34 ; AQUA&#34; };    DisplayArray(arr,&#34;在方法调用之前&#34;);

ArrayCalledWithOrderBy(ARR);

两个不同的变量是否包含对同一个数组的引用,直到这一行:

arr = (arr.OrderBy(i => i).ToArray()); 

在此行中,您更改arr以引用已排序的数组,而不是传入的数组。请参阅? OrderBy创建一个已排序的新数组。原始数组没有变异。

Array.Sort改变传入的数组,因此它实际上改变了arr

var arr = new string[] { "pink", "blue", "red", "black", "aqua" };

答案 1 :(得分:1)

在这一行:

arr = (arr.OrderBy(i => i).ToArray()); 

您正在创建一个新数组并分配给arr。传递给该函数的数组不再可由该函数访问。如果您希望能够修改数组arr以便其他函数可以使用它,则需要使用ref keyword

public static void ArrayCalledWithOrderBy(ref string[] arr)

答案 2 :(得分:0)

您可以使用Object.ReferenceEquals来检查arr的引用是否在调用arr.OrderBy(i =&gt; i).ToArray()之后发生了变化。

public static void ArrayCalledWithOrderBy(string[] origin)
   {
       var arr = (origin.OrderBy(i => i).ToArray());
       //isEqual flag is false
       var isEqual = Object.ReferenceEquals(arr, origin);

      DisplayArray(arr, "After orderby inside method");
   }
相关问题