• 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

  • 相关阅读:
    2.1 CDN Bypass
    4.1 SQL Injection
    ztosec/secscan-authcheck 安装部署教程
    浏览器的内部构造
    左右值的概念
    网络安全学习路线
    Python+Typora博客图片上传
    微信欢乐五子棋辅助
    [SUCTF 2019]EasySQL
    [护网杯 2018]easy_tornado (SSTI)
  • 原文地址:https://www.cnblogs.com/sands/p/16016420.html
Copyright © 2020-2023  润新知