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 @   sands  阅读(415)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示