distinct()使我的参数表现得像一个值类型

本文关键字:一个 类型 我的 参数 distinct | 更新日期: 2023-09-27 18:06:11

我有一个简单的整数列表,叫做Numbers。我将这个列表发送给2个方法:第一个方法使用一个随机数来填充列表,其中包含333个1到100之间的数字。在填充结束时,我在列表上使用'Distinct()'来只获取不同的随机数,然后打印出列表所拥有的项目数量。第二个方法接收列表并打印出列表中元素的数量,即'Count'属性。

为什么我一直在同一个列表上工作,却得到不同的结果?

这是我的代码:

class Program
    {
        static List<int> Numbers = new List<int>();
        static Random Rnd = new Random();
        static void Main(string[] args)
        {
            FillNumbers(Numbers);
            CountNumbers(Numbers);
            Console.ReadLine();
        }
        private static void CountNumbers(List<int> numbers)
        {
            Console.WriteLine("There are {0} numbers the list", numbers.Count);
        }
        private static void FillNumbers(List<int> numbers)
        {
            for (int i = 0; i < 333; i++)
            {
                int n = Rnd.Next(1, 101);
                numbers.Add(n);             
            }
            numbers = numbers.Distinct().ToList();
            Console.WriteLine("After distinct there are {0} numbers in the list",numbers.Count);
        }
    }

distinct()使我的参数表现得像一个值类型

当您调用FillNumbers时,您不会改变Numbers变量。你首先改变给定的列表,然后根据不同的值生成一个新列表,然后将其分配给numbers,这是一个与Numbers非常不同的变量。它是该方法的一个参数,一旦FillNumbers完成执行,它就会消失。虽然您可以将您正在创建的列表分配给Numbers而不是numbers,但最佳实践实际上是将列表分配给return,让调用者对它做他们想做的事情,并且根本不接受列表作为输入,因为您的目标是创建一个全新的列表。

至于为什么CountNumbers观察列表中的非不同值,那是因为在添加项时,您正在改变 numbers引用的列表,而不是改变引用本身

这一行:

numbers = numbers.Distinct().ToList();

正在创建一个新列表。此列表将只包含不同的值,而原始列表则不包含。通过引用调用将修复它:

    private static void FillNumbers(ref List<int> numbers)
    {
        for (int i = 0; i < 333; i++)
        {
            int n = Rnd.Next(1, 101);
            numbers.Add(n);             
        }
        numbers = numbers.Distinct().ToList();
        Console.WriteLine("After distinct there are {0} numbers in the list",numbers.Count);
    }
class Program
{
   static void Main(string[] args)
   {
       var numbers = GetNumbers();
       CountNumbers(numbers);
       Console.ReadLine();
   }
   private static void CountNumbers(List<int> numbers)
   {
       Console.WriteLine("There are {0} numbers the list", numbers.Count);
   }
   private static List<int> GetNumbers()
   {
       var random = new Random();
       var numbers = new List<int>();
       for (int i = 0; i < 333; i++)
       {
           numbers.Add(random.Next(1, 101));             
       }
       numbers = numbers.Distinct().ToList();
       Console.WriteLine("After distinct there are {0} numbers in the list",numbers.Count);
       return numbers;
   }
}