1. 程式人生 > 其它 >c# 集合型別作為方法引數

c# 集合型別作為方法引數

開發中經常會對集合進行排序,如果把排序方法寫在另一個方法裡,集合作為方法引數時需要注意。

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