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