c# 集合型別作為方法引數
阿新 • • 發佈:2022-03-17
開發中經常會對集合進行排序,如果把排序方法寫在另一個方法裡,集合作為方法引數時需要注意。
public void Test()
{
var a = new List<int>() { 1, 8, 4, 9 };
Sort1(a);
Console.WriteLine("集合賦值 " + String.Join(",", a));
}
private void Sort1(List<int> nums)
{
nums = nums.OrderByDescending(p => p).ToList();
}
最後輸出結果依舊是 1, 8, 4, 9 並沒有達到排序效果。
這是因為 List 是引用型別,即儲存地址的值變數,List做為方法的引數時,nums是引用副本,方法內的記憶體地址和方法外的記憶體地址時一樣的,如果方法內的nums重新賦值也就是引用地址指向變了,那內外的引數就不一致了,所以不會影響方法外的nums的值。 如果不想使用副本,想直接使用方法外的原引用地址的值變數,就可以使用 ref來處理。或者對集合內部的項做處理,包括索引賦值,使用陣列的Sort方法,sort方法的內部實現也是索引賦值。
public void Test() { var a = new List<int>() { 1, 8, 4, 9 }; Sort1(a); Console.WriteLine("集合賦值 " + String.Join(",", a)); var b = new List<int>() { 1, 8, 4, 9 }; Sort2(b); Console.WriteLine("集合項賦值 " + String.Join(",", b)); var c = new List<int>() { 1, 8, 4, 9 }; Sort3(c); Console.WriteLine("陣列排序 " + String.Join(",", c)); var d = new List<int>() { 1, 8, 4, 9 }; Sort4(ref d); Console.WriteLine("ref 排序" + String.Join(",", d)); } private void Sort1(List<int> nums) { nums = nums.OrderByDescending(p => p).ToList(); } private void Sort2(List<int> nums) { var newNums = nums.OrderByDescending(p => p).ToList(); for (int i = 0; i < nums.Count; i++) { nums[i] = newNums[i]; } } private void Sort3(List<int> nums) { nums.Sort((x, y) => x - y);//從小到大 } private void Sort4(ref List<int> nums) { nums = nums.OrderByDescending(p => p).ToList(); }