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

image

posted @ 2022-03-17 11:11  sands  阅读(376)  评论(0编辑  收藏  举报