C# Distinct()使我的参数的行为类似于值类型

C# Distinct()使我的参数的行为类似于值类型,c#,.net,C#,.net,我有一个简单的整数列表,叫做数字。我将此列表发送给两种方法:第一种方法使用随机数填充列表,其中333个数字介于1和100之间。在填充结束时,我在列表上使用'Distinct()'仅获取不同的随机数,然后打印出列表中的项目数量。我的第二个方法接收列表并打印出其中的元素数,也就是“Count”属性 为什么我总是在同一个列表上工作,却得到不同的结果 这是我的代码: class Program { static List<int> Numbers = new Lis

我有一个简单的整数列表,叫做数字。我将此列表发送给两种方法:第一种方法使用随机数填充列表,其中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);
        }
    }
类程序
{
静态列表编号=新列表();
静态随机Rnd=新随机();
静态void Main(字符串[]参数)
{
数字;
数字;
Console.ReadLine();
}
专用静态无效计数编号(列表编号)
{
WriteLine(“列表中有{0}个数字”,numbers.Count);
}
专用静态无效填充编号(列表编号)
{
对于(int i=0;i<333;i++)
{
int n=Rnd.Next(1011);
编号。添加(n);
}
numbers=numbers.Distinct().ToList();
WriteLine(“在distinct之后,列表中有{0}个数字”,numbers.Count);
}
}
课程计划
{
静态void Main(字符串[]参数)
{
var numbers=GetNumbers();
数字;
Console.ReadLine();
}
专用静态无效计数编号(列表编号)
{
WriteLine(“列表中有{0}个数字”,numbers.Count);
}
私有静态列表GetNumbers()
{
var random=新的random();
变量编号=新列表();
对于(int i=0;i<333;i++)
{
加法(random.Next(1101));
}
numbers=numbers.Distinct().ToList();
WriteLine(“在distinct之后,列表中有{0}个数字”,numbers.Count);
返回号码;
}
}
此行:

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);
    }
private static void fillnumber(参考列表编号)
{
对于(int i=0;i<333;i++)
{
int n=Rnd.Next(1011);
编号。添加(n);
}
numbers=numbers.Distinct().ToList();
WriteLine(“在distinct之后,列表中有{0}个数字”,numbers.Count);
}

调用
FillNumbers
时,不会对
Numbers
变量进行变异。首先对给定的列表进行变异,然后根据不同的值生成一个新列表,然后将其分配给
numbers
,这是一个与
numbers
截然不同的变量。它是该方法的一个参数,只要
FillNumbers
完成执行,它就会消失。虽然您可以将要创建的列表分配给
数字
而不是
数字
,但最好的做法是
返回列表,让调用者使用它做他们想做的事情,并且根本不接受列表作为输入,因为您的目标是创建一个全新的列表


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

出于兴趣,为什么要在列表中添加不明显的数字,然后过滤它们?您可以改为使用哈希集,简单地添加(任何重复都将被忽略),或者如果需要跟踪重复,则检查数字是否已经存在。
List
是一种引用类型,它的行为与这里的引用类型完全相同。它不像值类型,因为它不是值类型。除了代码段仍然无法编译的问题外,您的解释文本也仍然非常错误。对列表的更改将被观察到。未观察到的是对列表引用的更改。既然你已经删除了你的解释,你的回答仍然毫无帮助。它没有解释为什么他的代码会做它所做的事情,你在改变什么,为什么这些改变很重要,等等。简单地说,FillNumbers函数并没有改变Numbers变量。使FillNumbers返回新列表(numbers变量)
    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);
    }