List.Distinct()使我的参数像一个值类型

时间:2014-06-02 15:18:18

标签: c# .net

我有一个名为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);
        }
    }

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

这一行:

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

答案 2 :(得分:-3)

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